Могу ли я повторно использовать 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();
}
Ответы
Ответ 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.