Подтвердить что ты не робот

Должен ли я вызвать Close на HttpWebResponse, даже если он внутри оператора using?

У меня есть некоторый код, этот код используется очень:

using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) {
    /* do something with the response */

    /* call r.Close() explicitly? */
}

Теперь код работает нормально, но соединения с сервером остаются открытыми в течение довольно долгого времени. (проверено с помощью TCPView)

Можно ли явно использовать метод Close()? Рекомендуется ли это, или, возможно, рекомендуется не делать этого и почему?

4b9b3361

Ответ 1

Если у вас есть существенный код внутри использования после того, как вы закончили употреблять ответ, тогда уверенное закрытие звонка в порядке. Однако вам может потребоваться рефакторинг кода, чтобы код, который не нуждается в ответе, находится не внутри блока.

Тем не менее, закрытие ответа не обязательно закрывает соединение. Протокол HTTP/1.1 предусматривает, что соединение остается открытым, чтобы быстрее выполнять последующие запросы.

Ответ 2

Когда Dispose() вызывается в WebResponse (HttpWebReponse базовый класс), он вызывает для него метод Close(). Быстрый просмотр с использованием Reflector подтверждает это.

Изменить (в ответ на комментарий): Если он вас уже вызвал, зачем вызывать его явно? Для большей ясности? Я думаю, если люди поймут инструкцию using (X x = ...), они поймут, что она закрывает базовое соединение. Вы ничего не получаете, называя это явно в этом случае.

Ответ 3

Ключевое слово using представляет собой синтаксический сахар для блока try/finally, который обтекает ваш HttpWebResponse, поскольку он реализует IDisposable. Когда в предложении finally он вызовет метод Dispose(), который вызовет Close(). Это означает, что вам не нужно явно обращаться к методу Close().

Ответ 4

Я считаю, что Close - это метод, реализующий IDisposable.Dispose, поэтому нет необходимости заранее называть метод Close. Он полностью избыточен.