Могут я для многократного использования 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();
    }
21
задан MatthewMartin 4 March 2016 в 16:36
поделиться

3 ответа

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

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

Из статьи MSDN:

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

15
ответ дан 29 November 2019 в 21:54
поделиться

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

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

2
ответ дан 29 November 2019 в 21:54
поделиться

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

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

Также оберните любую функцию GetResponseStream() в оператор use.

3
ответ дан 29 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: