Могут я для многократного использования 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();
}
Все будет в порядке, если вы просто позвоните Close on your response. Вам разрешено только столько "открытых" соединений, поэтому причина его неудачи в том, что он не может открыть новое соединение.
Как только вы закончите с ответом, вы должны закрыть его... не нужно ничего повторно использовать.
Из статьи MSDN:
Вы должны вызвать либо Stream.Close. или метод HttpWebResponse.Close к закрыть ответную реакцию и выпустить соединение для повторного использования. Это не так необходимо позвонить в оба канала Stream.Close и HttpWebResponse.Close, but doing так что не вызывает ошибки.
Просто создайте новый. Я бы не беспокоился о том, чтобы быть эффективным в этом сценарии, поскольку .NET Environment + HTTP Keepalives должна обрабатывать вещи для вас с этой точки зрения.
, вероятно, вы работаете в 1) проблему с количеством открытых соединений; Убейте соединение, и ошибка уйдет или 2) проблема с ограничениями количества запросов в секунду на сервере (анти-дос). Я сначала попробую # 1, так как он проще, а затем, если вы все еще видите проблему, убедитесь, что сервер получает запрос, но отрицает его.
Оберните ответный вызов в оператор use, чтобы убедиться, что соединение всегда закрыто:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url)
// ...
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// ...
}
Также оберните любую функцию GetResponseStream() в оператор use.