WebRequest无法正常工作

时间:2012-12-03 16:05:20

标签: .net browser

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

    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选项/连接

中正确配置了代理

有什么想法吗?

2 个答案:

答案 0 :(得分: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,并且不以任何方式表示缺乏连接!!!

答案 1 :(得分: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标志它的工作原理。这很奇怪,看起来像个臭虫。