我可以重用HttpWebRequest吗?
似乎对网站的第3次请求导致操作超时。似乎每个请求都创建了一个新连接,所以我想知道我是否可以通过更改URL并再次获取请求来重用HttpWebRequest。有问题的代码如下。此代码检查是否存在一系列网址。
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();
}
答案 0 :(得分:13)
如果你只是在你的回复上打电话给你,你应该没问题。您只允许这么多“开放”连接,因此它失败的原因是因为它无法打开新连接。
完成响应后,您需要关闭它...不需要重复使用任何内容。
来自MSDN article:
您必须调用Stream.Close 或者HttpWebResponse.Close方法来 关闭响应并释放 连接重用。它不是 必须同时调用Stream.Close 和HttpWebResponse.Close,但正在做 所以不会导致错误。
答案 1 :(得分:2)
只需创建一个新的。我不担心在这种情况下有效率,因为.NET环境+ HTTP Keepalive应该从我认为的那个角度为你处理事情。
可能你遇到了1)打开连接数量的问题;杀死连接并且错误将消失或2)服务器上每秒请求数限制的问题(反DoS内容)。我首先尝试#1,因为它更简单,然后如果你仍然看到问题,请检查服务器是否收到请求但拒绝它。
答案 2 :(得分:2)
在using语句中包含您的响应调用,以确保始终关闭连接:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url)
// ...
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// ...
}
还将任何GetResponseStream()包装在using语句中。