2009-10-08 106 views
2

我收到HttpWebRequest(使用修改后的版本Jeff Richter's CCR wrappers)的响应,然后检查一些标题以决定是否继续下载。有时我可能不想继续,因此我发布response.Closerequest.Abort。是否有必要发布GetResponseStream然后关闭流,或者这是隐含的,当你调用response.CloseHttpWebResponse:关闭流

发出的GetResponse的docs state后:

必须调用Close方法关闭该流并释放连接。否则可能会导致应用程序无法连接。

因此,这是否意味着一旦我们有回应,那么它是必须获得流并关闭它?

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

另外:假设它是同一个流,GetResponseStream是否安全两次?

回答

2

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

答案是IDisposable,我建议你一个使用语句。

+0

我错过了它是IDisposable。关于为什么Dispose方法是私人的任何线索?这是正常的吗?使用声明看起来像是一个很好的增强。 +1 – spender 2009-10-08 11:23:05

+1

[使用Dispose方法让智能自我不要检查“IDisposability”] – spender 2009-10-08 11:25:38

+0

@spender它已作为[显式接口实现]实现(http://msdn.microsoft.com/zh-cn/我们/库/ vstudio/ms173157.aspx)。我相信在框架的早期模式是隐藏'Dispose'在一个明确的实现后面并且定义一个执行相同动作的公共'Close'方法。 – 2013-08-07 20:58:37

6

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

从文档:

Close方法关闭响应流并释放其他请求

连接到资源再利用,必须调用要么Stream.Close或HttpWebResponse.Close方法来关闭流并释放连接以供重用。不必调用Stream.Close和HttpWebResponse.Close,但这样做不会导致错误。未能关闭流可能导致应用程序无法连接。

并为您的双的GetResponseStream问题,虽然​​没有明确提到它,它总是会返回相同的流对象,无论你有多少次调用它。

+0

要确认:我应该这样做,即使我从来没有在第一时间流? – spender 2009-10-08 10:19:47

+0

是的。我已添加更新。 – 2009-10-08 10:22:13

0

这样做WCF Connections

//Done with the service, let's close it. 
try 
{ 
    if (client.State != System.ServiceModel.CommunicationState.Faulted) 
    { 
     client.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    client.Abort(); 
}