HttpWebRequest / Response在“ipconfig / release”和“ipconfig / renew”

时间:2018-03-19 14:15:17

标签: c# httpwebrequest httpwebresponse

我已经编写了一个小型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;

1 个答案:

答案 0 :(得分:1)

我能够通过重置catch正文中的DefaultWebProxy 来解决问题:

 WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
 WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

感谢理查德指出我正确的方向。