我们需要关闭System.Net.WebRequest的ResponseStream吗?

时间:2011-09-12 10:49:42

标签: .net vb.net stream response system.net

我想知道我最终会从这段代码中获得任何未关闭的流:

   Public Function [Get](ByVal url As String) As String
        Using reader = New System.IO.StreamReader(System.Net.WebRequest.Create(url).GetResponse.GetResponseStream)
            Return reader.ReadToEnd
        End Using
    End Function

这个怎么样:

  Public Function Get2(ByVal url As String) As String
        Using stream = System.Net.WebRequest.Create(url).GetResponse.GetResponseStream
            Using reader = New System.IO.StreamReader(stream)
                Return reader.ReadToEnd
            End Using
        End Using
    End Function

基本上,我们是否需要关闭System.Net.WebRequest的{​​{1}}?

2 个答案:

答案 0 :(得分:7)

要么需要关闭响应流,您需要关闭响应。请注意,关闭StreamReader包裹Stream将关闭流,因此第一个版本应该没问题。 (注意,我认为“使用Using语句处理”在语义上等于“在finally块中关闭” - 显式调用Close而不是仅仅处理流或响应没有任何好处。)< / p>

相信关闭流是足够好的 - 您也不需要关闭响应 - 实际上that's what MSDN states,但我个人为了清晰起见:

Public Function [Get](ByVal url As String) As String
    Using response = WebRequest.Create(url).GetResponse
        Using reader = New System.IO.StreamReader(response.GetResponseStream)
            Return reader.ReadToEnd
        End Using
    End Using
End Function

(这里有一个理论好处,如果GetResponse成功返回,它会关闭响应,但GetResponseStreamStreamReader构造函数会抛出异常。不要指望有任何实际含义。)

如果你不关闭任何东西,你可能很容易在将来对同一主机的请求中遇到超时 - “开放”响应将基本上占用与该主机的连接,并且默认情况下每台主机有两个开放连接的限制。这是超时的一个非常常见的原因 - 有许多SO问题,人们因为没有关闭任何东西而导致超时。

答案 1 :(得分:2)

没有必要在WebResponse上调用Close方法,但这样做无害

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx