0

我编写了这个函数来检查互联网连接是否可用:

    bool IsOnline()
    {
        try
        {
            var request = (HttpWebRequest)WebRequest.CreateHttp("http://www.google.com/");
            request.Timeout = 2000;

            var response = (HttpWebResponse)request.GetResponse();
            return ((int)response.StatusCode) < 400;
        }
        catch (Exception) { return false; }      
    }

它似乎在几乎所有情况下都有效,但是在我的工作网络下,它在连接可用时超时错误后返回 false。

注意: - 此函数返回 false,但我可以在我的 WPF 应用程序中使用 webbrowser 组件上网 - 连接非常好。(因此加载 google.com 的时间不可能超过 2 秒) - 我在控制面板/Internet 选项/连接中正确配置的代理后面

有任何想法吗?

4

2 回答 2

0

在正常情况下,407 意味着您有一个代理阻止您...虽然它不会产生超时...它是一个“快速”回复,甚至不被视为异常...

尝试这个:

            HttpClientHandler clientHandler = new HttpClientHandler();
            clientHandler.Proxy = new WebProxy("PROXY ip HERE", true, null, System.Net.CredentialCache.DefaultNetworkCredentials);                

            HttpClient cli = new HttpClient(clientHandler);

            cli.BaseAddress = new Uri("http://google.com");

            HttpResponseMessage response = cli.GetAsync("").Result;  // Blocking call!

            textBox1.Text = response.Content.ReadAsStringAsync().Result;

顺便说一句,这使用 Web API ...

编辑:becaerfull!错误 401(未经授权)、500(内部服务器错误)大于 400,并不代表连接不畅!!!

于 2012-12-03T16:31:39.630 回答
0

作为解决方法,我以这种方式更改了我的功能:

bool IsOnline()
{
    try
    {
        var request = (HttpWebRequest)WebRequest.CreateHttp("http://www.google.com/");
        request.Timeout = 2000;

        var registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", false);
        var proxy = (string)registry.GetValue("ProxyServer");
        var isProxyEnabled = (int)registry.GetValue("ProxyEnable");
        if (isProxyEnabled>0)
        {
            request.Proxy = new WebProxy(proxy, true, null, System.Net.CredentialCache.DefaultNetworkCredentials);
        }

        var response = (HttpWebResponse)request.GetResponse();
        return ((int)response.StatusCode) < 400;
    }
    catch (Exception) { return false; }      
}

如果我尝试使用 WebRequest.GetSystemWebProxy(),我会得到一个 IWebProxy (WrappedWebProxy),它的设置与我手动构建的设置相同,但它不起作用。如果我没有检查“绕过本地地址的代理服务器”,它也会将所有地址识别为本地地址。

然后,如果我通过调试器更改 bypasslocal 标志,它就可以工作。太奇怪了,看起来像个虫子。

于 2012-12-10T14:57:20.653 回答