HttpWebResponse: закрытие потока

Я получаю ответ от HttpWebRequest ( используя модифицированную версию (CCR-оболочки Джеффа Рихтера), затем изучив несколько заголовков, чтобы решить, продолжать загрузку или нет. Иногда мне не хочется продолжать, поэтому я выдаю response.Close и request.Abort < / а>. Нужно ли выдавать GetResponseStream, а затем закрыть поток, или это неявно, когда вызывается ответ .Закрыть?

После запуска GetResponse состояние документов:

Вы должны вызвать метод Close, чтобы закрыть поток и освободить соединение. В противном случае у вашего приложения могут закончиться соединения.

Значит ли это, что если у нас есть ответ, то обязательно получить поток и закрыть его?

Мы наблюдаем довольно странные проблемы, из-за которых зависшие загрузки в конечном итоге забивают систему. Это кажется наиболее сильным кандидатом на утечку ресурсов, но задайтесь вопросом, есть ли у кого-нибудь еще опыт решения этой проблемы.

В качестве отступления: безопасно ли дважды использовать GetResponseStream в предположении, что это один и тот же поток?


person spender    schedule 08.10.2009    source источник


Ответы (3)


Фактически, вызов webResponse.Close () закроет поток ответа.

Ответ IDisposable, я советую вам использовать оператор.

person Guillaume    schedule 08.10.2009
comment
Я пропустил, что это было IDisposable. Любая подсказка относительно того, почему метод Dispose является частным? Это нормально? Оператор using кажется отличным усовершенствованием. +1 - person spender; 08.10.2009
comment
[Делает мысленную заметку для себя, чтобы не проверять возможность IDisposability путем перехода intellisense для метода Dispose] - person spender; 08.10.2009
comment
@spender Он реализован как явная реализация интерфейса. Я считаю, что шаблон на раннем этапе фреймворка заключался в том, чтобы скрыть Dispose за явной реализацией и определить общедоступный Close метод, выполняющий то же действие. - person Richard Szalay; 08.08.2013

Вызов HttpWebResponse.Close закрывается поток ответов.

Из документации:

Метод Close закрывает поток ответов и освобождает соединение с ресурсом для повторного использования другими запросами.

Вы должны вызвать метод Stream.Close или HttpWebResponse.Close, чтобы закрыть поток и освободить соединение для повторного использования. Нет необходимости вызывать одновременно Stream.Close и HttpWebResponse.Close, но это не вызывает ошибки. Неспособность закрыть поток может привести к тому, что у вашего приложения закончатся соединения.

И для вашего вопроса с двойным GetResponseStream, хотя в документации это прямо не упоминается, он всегда будет возвращать один и тот же объект потока, независимо от того, сколько раз вы его вызываете.

person Richard Szalay    schedule 08.10.2009
comment
Для подтверждения: я должен сделать это, даже если у меня вообще не было потока? - person spender; 08.10.2009

сделайте что-нибудь вроде подключений WCF

//Done with the service, let's close it.
try
{
   if (client.State != System.ServiceModel.CommunicationState.Faulted)
   {
      client.Close();
   }
}
catch (Exception ex)
{
   client.Abort();
}
person SarjanWebDev    schedule 25.05.2011