【问题标题】:HttpWebRequest Operation Timeout with CookieContainer使用 CookieContainer 的 HttpWebRequest 操作超时
【发布时间】:2011-11-27 12:19:11
【问题描述】:

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

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

它会在

中抛出Operation Timeout异常
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

如果我不添加CookieContainer,程序运行不会出错。为什么这不起作用?

【问题讨论】:

    标签: c# httpwebrequest timeout


    【解决方案1】:

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

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

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

    【讨论】:

    • 这个 EnableSessionState 在哪里改变?
    【解决方案2】:

    你是如何创建 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 个连接,每个 http/1.0 服务器 4 个连接,或者在 ServicePoint 上设置的自定义限制),并且没有连接可以向其发送请求服务器。换句话说,您可能有 2 个未完成的请求(例如:到 1.1 服务器)需要 2 分钟以上才能完成,然后向同一服务器发出另一个 GetResponse()。最后的 getresponse() 可能会超时。

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

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

    【讨论】:

    • 感谢 Niranjan。我已设置 myWebRequest.Timeout =xxx,但它不起作用。
    【解决方案3】:

    情况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 毫秒从我的计算机响应。如果 Internet 连接速度较慢,此代码可能会返回超时。

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

    情况2: 如果您连接到的服务器意识到启用了 cookie,则可能需要更长的时间。当您没有对req.CookieContainer 设置任何内容时,cookie 将被禁用。所以请确定这个事实。 :) 希望它会起作用。

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      相关资源
      最近更新 更多