测试互联网连接的最快方法

C#2008 SP1

我使用此代码连接到我们的客户网站。 这适用于软电话应用程序。 在用户拨打电话之前,软电话必须测试是否存在活动的Internet连接。

所以,希望我已经完成使用httpWebRequest类连接到我们的客户网站。 如果响应正常,则可以继续进行Internet连接。

但是,我注意到响应的响应时间太长。 我不确定这不是一种非常有效的测试方法。

但是,当我浏览他们的网站时,加载页面只需不到一秒钟。 但是当我使用HttpWebRequest类时需要太长时间

所以对此的要求是:

有时会在客户办公室使用代理。 我不能使用TCPClient类(没有代理属性)。

代理不支持SOCKS,因此无法使用Sockets类。

我需要使用超时属性。 所以不能使用WebClient类。 这是因为软电话会冻结,直到返回响应。 几秒后超时。

所以我唯一能想到的就是HttpWebRequest类。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxxxxxxxx.com"); request.Timeout = 5000; request.Credentials = CredentialCache.DefaultNetworkCredentials; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { Console.WriteLine("IsSIPServerAvailable: " + response.StatusCode); isAvailable = true; } 

========使用p \ Invoke编辑====

  [DllImport("wininet.dll", CharSet = CharSet.Auto)] private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved); [Flags] enum InternetConnectionState_e : int { INTERNET_CONNECTION_MODEM = 0x1, INTERNET_CONNECTION_LAN = 0x2, INTERNET_CONNECTION_PROXY = 0x4, INTERNET_RAS_INSTALLED = 0x10, INTERNET_CONNECTION_OFFLINE = 0x20, INTERNET_CONNECTION_CONFIGURED = 0x40 } // In function for checking internet InternetConnectionState_e flags = 0; bool isConnected = InternetGetConnectedState(ref flags, 0); 

尝试使用P / Invoke调用InternetGetConnectedState 。 这应该告诉您是否配置了连接。 然后,您可以尝试使用InternetCheckConnection检查与服务的特定连接。 这有时(有时)比直接连接连接更快,但我会测试它是否比预先完全连接更好。

什么是软电话用于真正的通信? 这是通过HTTP / HTTPS到同一个网站吗? 如果是这样,这绝对是正确的方法 – 下一步是找出为什么这么长时间。

在您提出请求之前,网络连接是否已确定? 你是不是事先没有提出任何要求? 我问,因为我注意到你没有处理响应 – 如果在其他地方也发生了这种情况,你可能会发现你正在运行连接池,只能给你一些特定服务器的连接。 道德是总是HttpWebResponse s放在using语句中。 当然,这可能不是你的问题,但值得一试。

如果您的实际应用程序要连接到其他地方,那么您的测试也应该检查。 基本上,尽可能接近真实的东西。

出于兴趣,你说它是一个“软电话”应用程序 – 这实际上是一些描述的手机上运行,​​使用紧凑的框架,还是桌面应用程序?

我有类似的情况,我们打算对客户端进行WCF调用,如果客户端无法访问(无论出于何种原因),则需要很长时间。 我所做的是打开一个原始的TCP套接字到客户端地址…如果客户端没有在端口(在你的情况下是端口80)监听,如果它们在那里很快就会成功,这会很快失败。

这给了我最快,最准确的答案,以确定我是否能够与我想要达到的端点进行通信。 唯一的缺点是你必须自己在套接字上管理超时,因为只有发送和接收超时的选项没有连接。

它是这样的……

 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { IAsyncResult result = socket.BeginConnect("www.xxxxxxxxx.com", 80, null, null ); //I set it for 3 sec timeout, but if you are on an internal LAN you can probably //drop that down a little because this should be instant if it is going to work bool success = result.AsyncWaitHandle.WaitOne( 3000, true ); if ( !success ) { throw new ApplicationException("Failed to connect server."); } // Success //... } finally { //You should always close the socket! socket.Close(); } 

我没有在我面前使用的实际代码,但这应该让你走上一般道路。

您可以引用Microsoft.VisualBasic.Devices命名空间以使用NetworkAvailableEventHandler委托和Network类。 我使用Network.IsAvailable属性和Network.NetworkAvailabilityChanged事件来检查网络是否存在(或稍后受到影响),然后对我的服务器执行HTTP GET以查看服务器是否存在。

这有助于更具体地报告问题,而不是“无法看到网络”。

更好的选择是添加对Microsoft.VisualBasic的引用并添加using语句Microsoft.VisualBasic.Device然后您可以使用以下代码行来检查与任何网络的连接。

 public static bool isConnectedToNetwork { get { Network network = new Network(); return network.IsAvailable; } } 

request.GetResponse() 本身会在主机名无法解析的情况下给你一个例外,所以你可能想在它周围放一个try-catch,捕获System.Net.WebException ,并检查它的错误状态。 Status属性。 但我不确定哪种状态确实表明没有互联网; 大多数响应也可能是由于dns或其他连接问题。