HttpWebResponse: 关闭流

3
我正在从一个HttpWebRequest中获取响应(使用修改后的版本Jeff Richter的CCR包装器),然后检查一些标题以决定是否继续下载。有时我可能不想继续,所以我会相应地发出response.Closerequest.Abort。在调用response.Close时,是否需要调用GetResponseStream来关闭流,还是这是隐含的?
在发出GetResponse之后,文档状态如下:
必须调用Close方法关闭流并释放连接。如果没有这样做,可能会导致应用程序耗尽连接。
那么这是否意味着一旦我们有了响应,就必须获取流并关闭它?
我们看到一些相当奇怪的问题,其中挂起的下载最终会淹没系统。这似乎是资源泄漏的最有力候选者,但想知道是否有其他人遇到过这个问题。
另外:在假设为同一流的情况下,两次获取GetResponseStream是否安全?
3个回答

6

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

从文档中可以看出:

Close方法关闭响应流并释放连接,以便其他请求可以重用该资源。

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

另外,对于你的双重GetResponseStream问题,虽然文档没有明确提到,但它将始终返回相同的流对象,无论你调用多少次。


确认一下:即使我一开始没有获取到流,我也应该这样做吗? - spender

3

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

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


我错过了它是IDisposable。你有什么线索,为什么Dispose方法是私有的?这正常吗?使用using语句似乎是一个很好的增强。+1 - spender
1
在脑海中记下自己不要通过浏览Dispose方法的智能感知来检查“IDisposability”。 - spender
@spender 它已经被实现为显式接口实现。我相信在框架早期的模式是将Dispose隐藏在一个显式实现后面,并定义一个公共的Close方法来执行相同的操作。 - Richard Szalay

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接