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

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

Можно ли повторно использовать 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();
    }
4b9b3361

Ответ 1

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

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

Из статьи MSDN:

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

Ответ 2

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

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

Ответ 3

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

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

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