我被要求编写一个小程序,检查我们在线的所有页面都没有错误。
为此,我使用以下代码(其中pathsToCheck为List,每个字符串都是http://www.domain.com/webpage
之类的URL)
foreach (string path in pathsToCheck)
{
HttpWebResponse response = null;
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(path);
webRequest.AllowAutoRedirect = true;
response = (HttpWebResponse)webRequest.GetResponse();
System.Diagnostics.Debug.Assert(response.StatusDescription == "OK", "Look into this, it doesn't like the response code");
System.Threading.Thread.Sleep(1000);
}
catch (Exception ex)
{
Console.WriteLine("Failed : " + path);
}
finally
{
Write(--totalPathsToCheck);
}
}
我遇到的问题是它总是从列表中的第三项失败(超时)(一切都从第三项失败)。当然,我猜测第三项肯定有问题,但是没有。
由于第一个项目没有超时,我创建了一个新列表,其中包含5个项目,所有相同的URL(我知道其中一个不会超时)。出现同样的问题,在第三次迭代中,它会超时,并继续超时到列表的其余部分。
然后我决定测试一个不同的URL(在不同的域上)并且同样的问题仍然存在。
我在代码中添加了睡眠,并且在给定时间段内有太多请求的情况下增加了它,但没有产生任何差异。
我该怎么办?
答案 0 :(得分:1)
您需要关闭连接。添加
response.Close();
来自http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.close.aspx:
Close方法关闭响应流并释放与资源的连接以供其他请求重用。 您必须调用Stream.Close或HttpWebResponse.Close方法来关闭流并释放连接以便重用。没有必要同时调用Stream.Close和HttpWebResponse.Close,但这样做不会导致错误。无法关闭流可能会导致应用程序用完连接。