. net -请求在一段时间后超时
本文关键字:超时 一段时间 请求 net | 更新日期: 2023-09-27 18:03:42
我正在编写一个简单的应用程序,用于在一段时间内查询某个URL以检测更改,但是我注意到在5000个左右的请求之后,请求将开始超时。
它会在宿主中循环(大约有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;
}
}
非常奇怪,因为我认为有一个问题与连接,然后重新启动应用程序不会解决这个问题。看起来,应用程序运行的时间越长,网络就会被"堵塞"。也许我没有正确地刷新资源或者类似的事情。
第一个请求总是超时,这可能是相关的。
帮助将是伟大的
您需要更多的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
,但这样做不会导致错误。关闭流失败将导致应用程序的连接数耗尽。