当叫WebResponse.Close()
-
19-09-2019 - |
题
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
{
}
那里应该响应。Close()被叫什么?
之后每GetResponse()以试试吗?
后GetResponse()在尝试一次?
- 在最后块?
解决方案
没有一以上。你应该使用 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
块将确保处理方法,是否有一个例外。处理将做同样的事情,以关闭。
using (var d = new DisposableClass()){code;}
相当于:
DisposableClass d = null;
try
{
d = new DisposableClass();
code;
}
finally
{
if (d != null)
((IDisposable)d).Dispose();
}
其他提示
把它放在最后块。为每 MSDN:
最后块是有用的 清理任何资源分配 试块以及任何运行的 代码,必须执行,即使有 是一个例外。控制是总是 传递到最后无论块 如何试图阻退出。
注意嵌套的使用块不需要括号,提高其可读性。所以约翰Saunder的代码可以写成:
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 了解到,这种嵌套块不需要缩进.注意顺便说一句,如果您知道的编码的反应或是要忽略它,无论如何,Web客户端提供了一个简单的API-丢头信息,所以头部为基础(传/文本)的编码检测成为不可能的,但除此之外,它工作正常。
我谨建议以下的
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
{
}
不隶属于 StackOverflow