3

我从HttpWebRequest获得响应(使用修改后的版本Jeff Richter 的 CCR 包装器),然后检查一些标头以确定是否继续下载。有时我可能不想继续,所以我因此发出response.Closerequest.Abort。是否有必要发出GetResponseStream然后关闭流,或者这是在调用response.Close时隐含的?

发出 GetResponse 后,文档状态

您必须调用 Close 方法来关闭流并释放连接。不这样做可能会导致您的应用程序连接不足。

那么这是否意味着一旦我们得到响应,就必须获取流并关闭它?

我们看到了一些相当奇怪的问题,即挂起的下载最终会淹没系统。这似乎是资源泄漏的最强候选者,但想知道是否有其他人有此问题的经验。

顺便说一句:假设它是同一个流,两次 GetResponseStream 是否安全?

4

3 回答 3

6

调用HttpWebResponse.Close隐式关闭响应流。

从文档中:

Close 方法关闭响应流并释放与资源的连接以供其他请求重用

您必须调用 Stream.Close 或 HttpWebResponse.Close 方法来关闭流并释放连接以供重用。不必同时调用 Stream.Close 和 HttpWebResponse.Close,但这样做不会导致错误。未能关闭流可能会导致您的应用程序用尽连接。

对于您的双 GetResponseStream 问题,尽管文档没有明确提及它,但无论您调用多少次,它都将始终返回相同的流对象。

于 2009-10-08T10:17:53.933 回答
2

实际上,调用 webResponse.Close() 将关闭响应流。

响应是 IDisposable,我建议您使用 using 语句。

于 2009-10-08T10:21:47.313 回答
0

做类似WCF 连接的事情

//Done with the service, let's close it.
try
{
   if (client.State != System.ServiceModel.CommunicationState.Faulted)
   {
      client.Close();
   }
}
catch (Exception ex)
{
   client.Abort();
}
于 2011-05-25T07:00:59.270 回答