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

时间:2015-07-20 01:18:55

标签: c# .net

我正在编写一个简单的应用程序,在一段时间内查询某个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;
    }
}

非常奇怪,因为我认为连接存在问题,然后重新启动应用程序无法解决问题。看起来网络正在被堵塞"应用程序运行的时间越长。也许我没有正确地刷新资源或类似的东西。

另外可能有必要提及第一个请求总是超时。

帮助会很棒

1 个答案:

答案 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.CloseHttpWebResponse.Close方法来关闭流并释放连接以便重复使用。没有必要同时调用Stream.CloseHttpWebResponse.Close,但这样做不会导致错误。 无法关闭流将导致您的应用程序用完连接。