一段时间后,HttpWebRequest.GetResponse()超时

时间:2016-10-14 13:53:35

标签: httpwebrequest compact-framework

我有应用程序不断地向同一个REST服务器发送请求,经过一段时间HttpWebRequest.GetResponse()开始超时我注意到每当我增加System.Net.ServicePointManager.DefaultConnectionLimit时它需要更长的时间才能再次开始超时,这应该意味着这些请求保持活跃,但据我所知,我正在关闭所有这些请求。

这是我用于我的请求的方法。

当前DefaultConnectionLimit设置为10.

在大多数应用程序生命周期中,还有1个请求正在进行中。

我正在使用.NET Compact框架,REST服务器是使用WCF(.NET 4.5)

编写的
public static string HttpRequest(string request, string method, string contentType, int timeout)
     {
                string result = "";
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(PodesavanjaManager.TrenutnaPodesavanja.PutanjaServisa + "/" + request);
                req.Method = method;
                req.ContentType = contentType;
                req.Timeout = timeout;
                req.KeepAlive = false;
                if(method == "POST")
                    req.ContentLength = 0;
                using(Stream stream = req.GetResponse().GetResponseStream())
                {
                    using(StreamReader reader = new StreamReader(stream))
                    {
                        result = reader.ReadToEnd();
                        reader.Close();
                    }
                    stream.Close();
                    stream.Flush();
                }
                return result;
      }

编辑新版本的方法:

public static string HttpRequest(string request, string method, string contentType, int timeout)
{

    string result = "";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(PodesavanjaManager.TrenutnaPodesavanja.PutanjaServisa + "/" + request);
    req.Method = method;
    req.ContentType = contentType;
    req.Timeout = timeout;
    req.KeepAlive = false;


    if(method == "POST")
        req.ContentLength = 0;
    using (HttpWebResponse resp =(HttpWebResponse) req.GetResponse())
    {
        using (Stream stream = resp.GetResponseStream())
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                result = reader.ReadToEnd();
                reader.Close();
            }
        }
    }
    GC.Collect(); 
    return result;
}

1 个答案:

答案 0 :(得分:0)

我同意它表现就像连接仍然被尚未关闭的资源使用一样。 HttpWebResponse提到的documentation

  

您必须调用Stream.Close或HttpWebResponse.Close方法来关闭响应并释放连接以便重用。没有必要同时调用Stream.Close和HttpWebResponse.Close,但这样做不会导致错误。

我希望有一个更简单的描述,例如“你必须关闭GetResponseStream返回的流或调用HttpWebResponse.Close方法 - 但如果我对文档的解释是正确的,那么你的代码就可以了

我们在CE应用程序中也使用HttpWebRequest,并且总是将响应放在using块中 - 您可以试试这个:

using(HttpWebResponse response = (HttpWebResponse)req.GetResponse())
using(Stream stream = response.GetResponseStream())
{
    // ...
}

您还检查了其他HttpWebRequest用法的代码吗?