Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest/Response在“之后未恢复”;ipconfig/release";及;ipconfig/renew";_C#_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# HttpWebRequest/Response在“之后未恢复”;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);

我已经编写了一个小型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()
直到我尝试断开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;