. 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;
    }
}

非常奇怪,因为我认为有一个问题与连接,然后重新启动应用程序不会解决这个问题。看起来,应用程序运行的时间越长,网络就会被"堵塞"。也许我没有正确地刷新资源或者类似的事情。

第一个请求总是超时,这可能是相关的。

帮助将是伟大的

. net -请求在一段时间后超时

您需要更多的using语句:

using (var resp = request.GetResponse())
using (var responseStream = resp.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
    ret = reader.ReadToEnd();
}

如果不调用Close或处置由GetResponseStream返回的流,连接将不会被释放,这就是为什么您在一段时间后耗尽连接。MSDN对此很清楚:

您必须调用Stream.CloseHttpWebResponse.Close方法来关闭流并释放连接以进行重用。没有必要同时调用Stream.CloseHttpWebResponse.Close,但这样做不会导致错误。关闭流失败将导致应用程序的连接数耗尽。