我可以重用HttpWebRequest吗?

时间:2010-02-01 19:57:04

标签: .net httpwebrequest

我可以重用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();
    }

3 个答案:

答案 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语句中。