C# HttpWebRequest/Response在“之后未恢复”;ipconfig/release";及;ipconfig/renew";
我已经编写了一个小型Windows服务来检查网站的可用性。我注意到它由于NIC进入睡眠状态而失败,但即使在NIC唤醒后请求也无法恢复 我只需在检查站点的WinForm上使用“ipconfig/release”和“ipconfig/renew”,就可以重现这个问题 代码如下:C# HttpWebRequest/Response在“之后未恢复”;ipconfig/release";及;ipconfig/renew";,c#,httpwebrequest,httpwebresponse,C#,Httpwebrequest,Httpwebresponse,我已经编写了一个小型Windows服务来检查网站的可用性。我注意到它由于NIC进入睡眠状态而失败,但即使在NIC唤醒后请求也无法恢复 我只需在检查站点的WinForm上使用“ipconfig/release”和“ipconfig/renew”,就可以重现这个问题 代码如下: private void checkSite() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(WebSite);
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()
直到我尝试断开NIC(ipconfig/release)的连接,之后它显然会失败,因为无法解析远程名称:“www.google.it”
重新连接NIC后(ipconfig/renew),方法持续失败,导致无法连接到远程服务器
。
让它重新工作的唯一方法是关闭程序并重新启动它
我错过了什么
ps:我强制执行了一个GC.Collect()
,因为每次checkSite()
之后,进程的已用内存都会增加(即使每2分钟检查一次,它也不会被收集)
编辑:我发现request ServicePoint正在存储我在app.config中询问的DefaultProxy:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true"/>
</system.net>
我通过在
catch
正文中重置DefaultWebProxy解决了这个问题:
WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
感谢Richard为我指明了正确的方向。是否缓存无法解析状态的
ServicePointManager
缓存?谢谢@Richard,我如何检查?我四处查看了一下,但在该类中找不到任何有用的东西来验证其缓存。除了设置连接组名称以便清除外,整个ServicePoint
和ServicePointManager
API非常有限。
WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;