【发布时间】:2011-04-29 01:47:22
【问题描述】:
为什么下面的代码在第二次(以及后续)运行时会超时?
代码挂在:
using (Stream objStream = request.GetResponse().GetResponseStream())
然后导致 WebException 表明请求已超时。
我已经用WebRequest 和HttpWebRequest 尝试过这个
编辑:似乎代码在request.GetResponse()中崩溃了
编辑:这篇文章表明它可能是一个 GC 问题 --> http://www.vbforums.com/showthread.php?t=610043 - 根据这篇文章,如果 Fiddler 在后台打开,问题就会得到缓解。
服务器在那里并且可用于请求。
private string GetQLMResponse(string URL)
{
HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
request.KeepAlive = false;
request.Timeout = 5000;
request.Proxy = null;
// Read stream
string responseString = String.Empty;
try
{
using (var response = request.GetResponse())
{
using (Stream objStream = response.GetResponseStream())
{
using (StreamReader objReader = new StreamReader(objStream))
{
responseString = objReader.ReadToEnd();
objReader.Close();
}
objStream.Flush();
objStream.Close();
}
response.Close();
}
}
catch (WebException ex)
{
throw new LicenseServerUnavailableException();
}
finally
{
request.Abort();
request = null;
GC.Collect();
}
return responseString;
}
抛出的 WebException 是:
{"操作超时"} [System.Net.WebException]: {"操作超时"} 数据:{System.Collections.ListDictionaryInternal} 帮助链接:空 内部异常:空 消息:“操作已超时” 来源:《系统》 StackTrace: " 在 System.Net.HttpWebRequest.GetResponse()\r\n 在 IQX.Licensing.License.GetQLMResponse(String URL) 在 C:\Users\jd\SVN\jd\Products\Development\JAD.Licensing\JAD .Licensing\License.cs:第 373 行" 目标站点:{System.Net.WebResponse GetResponse()}
更新:好的所以下面的代码现在可以工作了。 servicePoint 将超时设置为接近 4 分钟。在请求对象上更改ServicePoint.ConnectionLeaseTimeout 意味着请求现在在 5000 毫秒后被销毁。感谢大家的帮助以及这两页:
- http://blogs.msdn.com/b/adarshk/archive/2005/01/02/345411.aspx
-
http://msdn.microsoft.com/en-us/library/6hszazfz(v=VS.80).aspx
private string GetQLMResponse(string URL) { HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword); request.KeepAlive = false; request.Timeout = 5000; request.Proxy = null; request.ServicePoint.ConnectionLeaseTimeout = 5000; request.ServicePoint.MaxIdleTime = 5000; // Read stream string responseString = String.Empty; try { using (WebResponse response = request.GetResponse()) { using (Stream objStream = response.GetResponseStream()) { using (StreamReader objReader = new StreamReader(objStream)) { responseString = objReader.ReadToEnd(); objReader.Close(); } objStream.Flush(); objStream.Close(); } response.Close(); } } catch (WebException ex) { throw new LicenseServerUnavailableException(); } finally { request.Abort(); } return responseString; }
【问题讨论】:
-
你有什么理由用
gc标记这个? -
这篇帖子暗示可能是垃圾回收问题:vbforums.com/showthread.php?t=610043
-
哦,感谢您发布更新。解决了我的问题。
-
感谢您发布您的解决方案。今天为我节省了一点时间。
标签: c# http garbage-collection httpwebrequest webrequest