HttpWebRequest.AllowAutoRedirect = false会导致超时吗?

时间:2010-01-07 16:55:43

标签: c# .net redirect httpwebrequest

我需要测试大约300个网址,以验证它们是否会导致实际网页或重定向到其他网页。我使用HttpWebRequest在.NET 2.0中编写了一个简单的应用程序来检查它。这是代码片段:

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行 - 它再次正常工作。取消注释此行 - 超时。什么可能导致这个问题的想法以及如何解决?

1 个答案:

答案 0 :(得分:8)

通常超时是由于网络响应没有被处理掉。您的using

应该有HttpWebResponse声明
using (HttpWebResponse resp = (HttpWebResponse)wr.GetResponse())
{
    code = resp.StatusDescription;
    // ...
}

我们需要做更多的分析来预测这是否肯定是问题...或者你可以尝试一下:)

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