除非我重新启动计算机,否则 HttpWebRequest 每次都无法连接
Posted
技术标签:
【中文标题】除非我重新启动计算机,否则 HttpWebRequest 每次都无法连接【英文标题】:HttpWebRequest fails to connect everytime unless I restart the computer 【发布时间】:2013-03-14 15:47:43 【问题描述】:我有一个需要连接到远程 SAP 服务器的 WPF C# 应用程序。我在两台计算机(同一网络)上运行该应用程序,并且我知道服务器是可访问的。
首先,计算机A可以使用网络请求正常连接(经过多次尝试,它们都可以正常工作)。随机(似乎;我无法复制),所有 Web 请求都将失败,并显示消息“无法连接到远程服务器”(类型 System.Net.WebException)。在浏览器中导航到 URL 加载正常;只有应用程序无法连接。抛出异常的方法是HttpWebRequest.GetRequestStream。
即使多次重启应用程序,所有的 HttpWebRequests 仍然无法连接。我们有多个 SAP 服务器,尝试连接到其中任何一个都会得到相同的结果。同时,计算机B(我的开发机器)上的应用程序仍然可以毫无问题地连接到任何服务器。电脑A完全重启后,才能重新连接。
到目前为止,这已发生在两台不同的计算机上。这两次,解决它的唯一方法是重新启动计算机。
这里有一些代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.ContentLength = contentLength;
request.Headers.Add("Authorization", GetAuthHeader());
request.Timeout = GetTimeout();
Stream post = request.GetRequestStream();//this line throws the exception
//...write to stream...
post.Close();
编辑:忽略了响应部分:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responsedata = response.GetResponseStream();
//...read all response data...
if (responsedata != null)
responsedata.Close();
编辑2: 所以我注释掉了所有对 Close 的调用,并提出了几十个请求。我还删除了获取响应的代码并提出了更多请求。在这些测试中,我没有收到任何异常,一切正常。
除了这些结果,我可以理解这样的事情可能会破坏我的程序,但我不明白为什么在重新启动程序或尝试联系不同的远程服务器后它仍然会被破坏。 看起来 .NET 框架中出现了一些问题,除非我重新启动整个机器,否则它无法自行解决。
【问题讨论】:
您是否尝试过使用 Wireshark 查看网络级别发生的情况? @JonSkeet 哇,是的,当问题发生时,我绝对后悔没有看到那个。如果它再次发生,这是我要检查的第一件事。 @FUR10N ...您真的在阅读回复吗?如果您还没有这样做,我认为这样做可能是个好主意……您可能会留下一堆半完成的请求。 @spender 抱歉,忽略了那部分。不过我不希望这是相关的,因为当它开始失败时,它开始无法连接到我尝试的任何地址。 如果您不处置响应或响应流,则此错误非常常见。即使在例外情况下,您也必须非常小心地始终这样做。不需要太多泄露的HttpWebResponse
或响应流对象就可以让您的程序停止工作。
【参考方案1】:
在这里,
Wireshark 日志在尝试连接时没有显示任何内容,所以我认为其他程序完全阻止了我的 EXE 网络访问。
原来是 Bitdefender 阻止了它。我卸载了它,一切都开始工作了。我不知道它为什么决定开始屏蔽它,但这就是答案。
【讨论】:
以上是关于除非我重新启动计算机,否则 HttpWebRequest 每次都无法连接的主要内容,如果未能解决你的问题,请参考以下文章
除非重新启动项目,否则 VS .Net Core Razor 页面不会更新
Android - 添加到 SQLite 数据库后不会更新 ListView,除非重新启动应用程序