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

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

3 голосов
/ 08 октября 2009

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

После выдачи GetResponse состояние docs :

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 08 октября 2009

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

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

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

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

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

2 голосов
/ 08 октября 2009

На самом деле, вызов webResponse.Close () закроет поток ответа.

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

0 голосов
/ 25 мая 2011

сделать что-то вроде Соединения WCF

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