我写了这个函数来检查互联网连接是否可用:
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选项/连接
中正确配置了代理有什么想法吗?
答案 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标志它的工作原理。这很奇怪,看起来像个臭虫。