我有应用程序不断地向同一个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;
}
答案 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
用法的代码吗?