Могу ли я повторно использовать запрос HttpWebRequest? - PullRequest
21 голосов
/ 01 февраля 2010

Могу ли я повторно использовать запрос HttpWebRequest?

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

    static void storeList(TextWriter sw, string urlTemplate, int start, int end)
    {
        for (int i = start; i < end; i++)
        {
            var url = string.Format(urlTemplate, i);
            var req = (HttpWebRequest)HttpWebRequest.Create(url);
            {
                req.Method = "HEAD";
                tryHttpWebRequest
                {
                    var resp = req.GetResponse();
                    sw.WriteLine(i);
                }
                catch (Exception e)
                {
                }
            }
        }
        sw.Flush();
    }

Ответы [ 3 ]

14 голосов
/ 01 февраля 2010

С вами все будет в порядке, если вы просто позвоните Клоузу в ответ. Вам разрешено только так много «открытых» соединений, поэтому причина его сбоя в том, что он не может открыть новое соединение.

Как только вы закончили с ответом, вам нужно закрыть его ... не нужно ничего повторно использовать.

Из статьи MSDN :

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

3 голосов
/ 04 февраля 2010

Оберните ваш ответный вызов в оператор использования, чтобы убедиться, что соединение всегда закрыто:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url)
// ...
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
  // ...
}

Также оберните любой GetResponseStream () в операторе using.

2 голосов
/ 01 февраля 2010

Просто создайте новый. Я бы не беспокоился о том, чтобы быть эффективным в этом сценарии, так как среда .NET + HTTP keepalive должны справиться с вами с той точки зрения, я считаю.

Возможно, вы столкнулись с 1) проблемой с количеством открытых соединений; разорвать соединение и ошибка исчезнет или 2) проблема с ограничением количества запросов в секунду на сервере (анти-DoS). Сначала я попробую # 1, поскольку это проще, а затем, если проблема все еще видится, проверьте, получает ли сервер запрос, но отклоняет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...