【问题标题】:HttpWebRequest.AllowAutoRedirect=false can cause timeout?HttpWebRequest.AllowAutoRedirect=false 会导致超时吗?
【发布时间】:2011-01-02 13:58:35
【问题描述】:

我需要测试大约 300 个 URL,以验证它们是指向实际页面还是重定向到其他页面。我使用 HttpWebRequest 在 .NET 2.0 中编写了一个简单的应用程序来检查它。这是sn-p的代码:

System.Net.HttpWebRequest wr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create( url );
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)wr.GetResponse();
code = resp.StatusDescription;

代码运行速度很快并写入文件,我的所有网址都返回状态 200 OK。然后我意识到默认情况下 GetResponse() 遵循重定向。傻我!所以我加了一行让它正常工作:

System.Net.HttpWebRequest wr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create( url );
wr.AllowAutoRedirect = false;
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)wr.GetResponse();
code = resp.StatusDescription;

我再次运行程序并等待......等待......等待......结果对于每个 url,我都得到了 System.Net.WebException“操作已超时”。惊讶的是,我手动检查了 URL - 工作正常......我注释掉 AllowAutoRedirect = false 行 - 它再次正常工作。取消注释这一行 - 超时。有什么想法可能导致此问题以及如何解决?

【问题讨论】:

    标签: c# .net redirect httpwebrequest


    【解决方案1】:

    通常超时是由于未处理 Web 响应。你的HttpWebResponse 应该有一个using 声明:

    using (HttpWebResponse resp = (HttpWebResponse)wr.GetResponse())
    {
        code = resp.StatusDescription;
        // ...
    }
    

    我们需要做更多的分析来预测这是否绝对是问题所在……或者你可以试试看 :)

    原因是 .NET 有一个连接池,如果你不关闭响应,连接就不会返回到池中(至少在 GC 完成响应之前)。这会在请求等待连接时导致挂起。

    【讨论】:

    • 不知道为什么在没有 AllowAutoRedirect=false 的情况下它可以正常工作,也不知道它是如何在第一次请求时知道我不会正确关闭它,但它有帮助!
    • @perpetka:当它重定向时,它可能正在关闭原始连接并且有足够的不同主机重定向到它避免了这个问题。
    • 有道理。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多