[c#] 测试互联网连接的最快方法


Answers

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

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

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

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

Question

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);



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

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




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




Related