13
WebResponse response;
try
{                
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 request.Timeout = 20000;
 response = request.GetResponse();

 request = (HttpWebRequest)WebRequest.Create(url2);
 response = request.GetResponse();
}
catch(Exception ex)
{
 //do something
}              
finally
{
}

应该在哪里调用 response.Close()?

  • 在尝试中的每个 GetResponse() 之后?

  • 在尝试最后一次 GetResponse() 之后 - 一次?

  • 在最后阻止?
4

4 回答 4

22

以上都不是。你应该使用一个using块:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var result = reader.ReadToEnd();
            // Do something with result
        }
    }
}

块将using确保调用 Dispose 方法,无论是否存在异常。Dispose 将执行与 Close 相同的操作。

using (var d = new DisposableClass()){code;}

相当于:

DisposableClass d = null;
try
{
    d = new DisposableClass();
    code;
}
finally
{
    if (d != null)
        ((IDisposable)d).Dispose();
}
于 2009-07-26T12:27:03.253 回答
1

把它放在 finally 块中。根据MSDN

finally 块对于清理在 try 块中分配的任何资源以及运行任何即使出现异常也必须执行的代码很有用。不管 try 块如何退出,控制总是传递给 finally 块。

于 2009-07-26T12:24:52.177 回答
0

请注意,嵌套 using 块不需要花括号,提高了可读性。所以约翰桑德的代码可以写成:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var result = reader.ReadToEnd();
    // Do something with result
}

VS.NET 知道这样的嵌套块不需要缩进。请注意,如果您知道响应的编码或无论如何都将忽略它,WebClient 提供了一个更简单的 API - 缺少标头信息,因此基于标头的(传输/文本)编码检测变得不可能,但除此之外它工作正常。

于 2009-07-26T13:34:33.333 回答
-1

我建议以下

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
            request.Timeout = 20000;
            using (var response = request.GetResponse())
            {
                //Do something with response.
            }


            request = (HttpWebRequest)WebRequest.Create("http://www.bing.com");
            using (var response = request.GetResponse())
            {
                //Do somehing with response
            }
        }
        catch (Exception ex)
        {
            //do something
        }
        finally
        {
        }
于 2009-07-26T12:26:46.263 回答