Когда нужно вызвать WebResponse.Close()
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()?
Ответы
Ответ 1
Ничего из перечисленного. Вы должны использовать блок 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
}
}
}
Блок A 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();
}
Ответ 2
Поместите его в блок finally. По MSDN:
Блок finally полезен для очистка любых ресурсов, выделенных в блок try, а также запуск любого код, который должен выполняться, даже если является исключением. Контроль всегда передано в блок finally как выйдет блок try.
Ответ 3
Обратите внимание, что вложенным блокам не нужны фигурные скобки, что повышает читаемость. Таким образом, можно написать код Джона Саундера:
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-доступ к информации о заголовках, поэтому обнаружение кодировки на основе заголовка (перенос/текст) становится невозможным, но в остальном оно отлично работает.
Ответ 4
Я бы предложил ниже
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
{
}