Должен ли я вызвать Close на HttpWebResponse, даже если он внутри оператора using?
У меня есть некоторый код, этот код используется очень:
using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) {
/* do something with the response */
/* call r.Close() explicitly? */
}
Теперь код работает нормально, но соединения с сервером остаются открытыми в течение довольно долгого времени. (проверено с помощью TCPView)
Можно ли явно использовать метод Close()
? Рекомендуется ли это, или, возможно, рекомендуется не делать этого и почему?
Ответы
Ответ 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. Он полностью избыточен.