我正在编写一个简单的应用程序,在一段时间内查询某个URL以检测更改,但我注意到在5,000个请求之后,请求将开始超时。
它通过主机循环(有大约200个不同的主机循环)
目标和源连接都非常稳定。
重新启动程序后,没有超时问题。
以下是相关代码:
public static string download_data()
{
String ret = String.Empty;
try
{
Uri newUri = new Uri(FinalURL.Replace(Host,Hosts[bestHostIndex]));
var request = (HttpWebRequest)WebRequest.Create(newUri);
request.Method = "GET";
request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.Referer = EscapedURL;
request.UserAgent = UA;
request.Headers.Add("Pragma", "no-cache");
request.Timeout = 3000;
request.Host = HostMain;
request.Proxy = null;
request.CookieContainer = Session.Cookies;
using (var resp = request.GetResponse())
{
var reader = new StreamReader(resp.GetResponseStream());
ret = reader.ReadToEnd();
}
return ret;
}
catch(WebException e)
{
Console.WriteLine("Error: "+e.Message);
if (e.Status == WebExceptionStatus.ProtocolError)
{
WebResponse resp = e.Response;
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
ret = sr.ReadToEnd();
}
}
return ret;
}
}
非常奇怪,因为我认为连接存在问题,然后重新启动应用程序无法解决问题。看起来网络正在被堵塞"应用程序运行的时间越长。也许我没有正确地刷新资源或类似的东西。
另外可能有必要提及第一个请求总是超时。
帮助会很棒
答案 0 :(得分:3)
您需要更多using
次陈述:
using (var resp = request.GetResponse())
using (var responseStream = resp.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
ret = reader.ReadToEnd();
}
如果不调用Close
或处理GetResponseStream
返回的流,则不会释放连接,这就是为什么你在一段时间后用完连接的原因。 MSDN很清楚:
您必须调用
Stream.Close
或HttpWebResponse.Close
方法来关闭流并释放连接以便重复使用。没有必要同时调用Stream.Close
和HttpWebResponse.Close
,但这样做不会导致错误。 无法关闭流将导致您的应用程序用完连接。