首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpWebRequest/响应在"ipconfig /release“和"ipconfig /renew”之后未恢复

HttpWebRequest/响应在"ipconfig /release“和"ipconfig /renew”之后未恢复
EN

Stack Overflow用户
提问于 2018-03-19 14:15:17
回答 1查看 92关注 0票数 1

我编写了一个小型的Windows服务来检查网站的可用性,我注意到由于NIC要睡觉,它失败了,但是即使在NIC醒来之后,请求也无法恢复。

我可以简单地在检查站点的/release上使用"ipconfig /renew“和"ipconfig /renew”来重现问题。

以下是代码:

代码语言:javascript
复制
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),之后它显然会在The remote name could not be resolved: 'www.google.it'中失败。在重新连接NIC (ipconfig /renew)之后,方法不断地失败Unable to connect to the remote server。让它再次工作的唯一方法是关闭程序并重新启动它。

我遗漏了什么?

ps:我强制使用了一个GC.Collect(),因为进程的使用内存在每个checkSite()之后都会增加(即使每2分钟检查一次,它也不会被收集)。

编辑:我发现请求ServicePoint按照我在app.config中的要求存储了DefaultProxy:

代码语言:javascript
复制
 <system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true"/>
 </system.net>

在"ipconfig /release“之后,ServicePoint失去了有关代理的所有内容,并且"ipconfig /renew”没有改变ServicePoint中的任何内容,它没有使用代理。

Edit2:请求正在丢失进程中的默认代理:

  • 首先,请求通过app.config中指定的默认代理;
  • ipconfig /release
  • 第二个请求被发送,不使用代理;
  • ipconfig /renew
  • 第三个请求被发送,仍然不使用代理。

是否有可能强制回退默认代理?我试过了,但没有结果:

代码语言:javascript
复制
IWebProxy webProxy = WebRequest.DefaultWebProxy;
webProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Proxy = webProxy;
EN

回答 1

Stack Overflow用户

发布于 2018-03-19 17:26:15

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

代码语言:javascript
复制
 WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
 WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

感谢理查德为我指明了正确的方向。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49365099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档