我已经编写了一个小型Windows服务来检查网站的可用性。我注意到它由于NIC进入睡眠状态而失败,但即使在NIC醒来后,请求也无法恢复。
我可以通过在检查网站的WinForm上使用“ipconfig / release”和“ipconfig / renew”来重现问题。
以下是代码:
private void checkSite()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(WebSite);
HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
request.AllowAutoRedirect = false;
request.Method = WebRequestMethods.Http.Head;
request.Timeout = 5000;
request.KeepAlive = false;
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
UpdateResult(response.StatusCode + " --> " + response.StatusDescription);
}
}
catch (WebException ex)
{
UpdateResult(ex.Message);
}
finally
{
request = null;
GC.Collect();
}
}
启动checkSite()
一直有效,直到我尝试断开网卡(ipconfig / release),之后它明显失败了The remote name could not be resolved: 'www.google.it'
。 重新连接网卡(ipconfig / renew)后,方法连续失败与Unable to connect to the remote server
。
让它再次工作的唯一方法是关闭程序并重新启动它。
我错过了什么?
ps:我强制使用GC.Collect()
,因为在每checkSite()
之后,进程的已用内存会增长(即使每隔2分钟检查一次,它也不会被收集)。
编辑:我发现请求ServicePoint正在我在app.config中询问时存储DefaultProxy:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true"/>
</system.net>
在“ipconfig / release”之后,ServicePoint丢失了有关代理的所有内容,“ipconfig / renew”不会更改ServicePoint中的任何内容,它不使用代理。
Edit2:请求在此过程中丢失了默认代理:
第一个请求通过默认代理服务器中的指定 的app.config;
ipconfig /release
;
发送第二个请求,不使用代理;
ipconfig /renew
;
发送第三个请求,仍然不使用代理。
是否可以强制退回默认代理? 我试过这个但无济于事:
IWebProxy webProxy = WebRequest.DefaultWebProxy;
webProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Proxy = webProxy;
答案 0 :(得分:1)
我能够通过重置catch
正文中的DefaultWebProxy 来解决问题:
WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
感谢理查德指出我正确的方向。