没有正确关闭.NET HttpWebRequest有什么后果?

时间:2014-12-12 11:35:50

标签: .net httpwebrequest webclient

这个问题几乎可以解释。我想知道打开Http请求的所有后果,例如:

  • 客户端和服务器上消耗的资源
  • 线程池或ServicePoint默认限制
  • 是否有默认超时?

正确关闭将在using语句中。一个不好的例子可能是:

var myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url.ToString()); 

WebResponse myWebResponse = myHttpWebRequest.GetResponse();
Stream receiveStream = myWebResponse.GetResponseStream();

var readStream = new StreamReader(receiveStream, readEncoding); 
response = readStream.ReadToEnd(); 

//if an error occurs, the close statements will not be executed!!!

readStream.Close(); 
myWebResponse.Close();

谢谢!

2 个答案:

答案 0 :(得分:0)

可能没什么。你必须设计一个非常奇怪的情况才能使这种特殊的失态产生负面影响。但是,如果你把一个场景放在一起,我可以想到两个潜在的后果:

  1. 操作系统支持有限数量的活动网络连接。您可能会耗尽这些,并且在其中一些网络资源完全关闭之前无法与任何网络资源进行通信。还要记住,你不知道计算机还有什么可能发生的事情:后台有几个bittorrent流,每个流都需要几百个连接到群中的其他主机,突然间你可能比你更接近这个限制了思想。
  2. 如果请求全部转到同一资源,则该资源可能会将您视为拒绝服务攻击者,并阻止所有未来的连接。
  3. 真的,那只是一个开始;我想到了什么。把玩具放在一边总是最好的。

答案 1 :(得分:0)

最糟糕的情况是,如果所有请求都没有关闭而失败,并且您创建了很多请求,那么您的客户端将耗尽ephemeral ports(用于传出请求的端口)并且根本无法连接到任何服务器,跨所有流程。这很糟糕。

显然,服务器也可能耗尽资源,但不会耗尽端口。通常,端口在任何其他资源(客户端和服务器)之前消失,但这完全取决于每个请求做什么。没有通用的,一刀切的答案。

真正的问题是:当你知道错误时,为什么你的第一直觉是不修复这个代码,而不是问它可能会制造什么可怕的东西?如果这段代码遇到麻烦,请相信我,你没有注意到这个