使用CookieContainer进行HttpWebRequest操作超时

时间:2011-11-27 12:19:11

标签: c# httpwebrequest timeout

当我使用HttpWebRequest并添加此内容时:

CookieContainer container = new CookieContainer();
request.CookieContainer = container;

它会在

中抛出操作超时异常
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

如果我不添加CookieContainer程序运行没有错误。为什么这不起作用?

3 个答案:

答案 0 :(得分:4)

我也有这个问题。当我请求一个网页时,我把HttpWebRequest放在Page_Load函数中,并将当前页面的cookie添加到CookieContainer中,但它只是挂在那里直到超时

问题是当我第一次请求网页asp dot net刚刚锁定会话以保护会话同时从不同的地方写入时。当我尝试调用HttpWebRequest来请求同一个域同一个Session时它将被阻塞,直到第一个页面结束它的会话锁定,同时,第一个页面正在等待HttpWebRequest结束它的工作 这两个请求只是等待对方直到超时。

好消息是我找到了解决这个问题的方法,我只是在第一页设置了EnableSessionState =“ReadOnly”,它使我调用的第一页不会锁定会话。 希望这可以帮助别人。

答案 1 :(得分:0)

您是如何创建Request对象的?

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(args[0]);
            request.CookieContainer = new CookieContainer();
            HttpWebResponse response = (HttpWebResponse) request.GetResponse();

CookieContainer

  

尝试设置myWebRequest.Timeout = xxx

  • 如果您正在运行多个并发请求,请尝试设置连接限制
  

System.Net.ServicePointManager.DefaultConnectionLimit
  ServicePoint.ConnectionLimit

检查这些链接以获取更多信息:

HttpWebRequest "operation has timed out"
I need help setting .NET HttpWebRequest timeout
Adjusting HttpWebRequest Connection Timeout in C#

以下是GetResponse()可能挂起的原因。有些是:

1)您已达到客户端的连接限制(每个http / 1.1服务器2个conns,每个http / 1.0服务器4个连接,或ServicePoint上设置的自定义限制),并且没有任何连接可以自由发送请求服务器。换句话说,您可能有2个未完成的请求(例如:到1.1服务器),完成时间超过2分钟,然后向同一服务器发出另一个GetResponse()。最后一个getresponse()可能会超时。

2)您尚未关闭早期httpwebresponse的响应流。因此,即使连接是免费的,也不会发送请求。

3)服务器发送响应的时间太长。

答案 2 :(得分:0)

情况1:

可能有几个原因。在阅读了有关您的问题后,我写了以下几行,这段代码可以使用,

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://google.com");
        req.Method = "GET";
        req.Timeout = 282;
        CookieContainer cont = new CookieContainer();
        req.CookieContainer = cont;

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

        using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
        {
            Console.Write(reader.ReadToEnd());
        }
        resp.Close();
        req.Abort();
        Console.ReadLine();

我写了req.Timeout = 282;,因为我测试了几个值,而http://google.com确实需要282毫秒来自我的电脑才能做出响应。从较慢的互联网连接,此代码可能会返回超时。

请务必将时间设置得足够高。

情况2: 如果它意识到启用了cookie,则可能是您连接的服务器需要更长的时间。如果您未将任何内容设置为req.CookieContainer,则会禁用Cookie。所以请确保这个事实。 :)希望它能奏效。