Вопрос

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() в try?

  • после последнего GetResponse() в try - once?

  • в последнем блоке?
Это было полезно?

Решение

Ни один из вышеперечисленных.Вы должны использовать 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();
}

Другие советы

Поместите это в блок finally.Согласно MSDN:

Блок finally полезен для очистки любых ресурсов, выделенных в блоке try, а также для запуска любого кода, который должен выполняться, даже если есть исключение.Управление всегда передается блоку finally, независимо от того, как завершается блок try.

Обратите внимание, что для вложенных блоков 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 - отсутствует информация заголовка, поэтому обнаружение кодировки на основе заголовка (передача/текст) становится невозможным, но в остальном оно работает нормально.

Я бы предложил ниже

        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
        {
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top