代码在以下处暂停:
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]: {"操作已超时"} Data: {System.Collections.ListDictionaryInternal} HelpLink: null InnerException: null Message: "操作已超时" Source: "System" StackTrace: " at System.Net.HttpWebRequest.GetResponse()\r\n at IQX.Licensing.License.GetQLMResponse(String URL) in C:\Users\jd\SVN\jd\Products\Development\JAD.Licensing\JAD.Licensing\License.cs:line 373" TargetSite: {System.Net.WebResponse GetResponse()}
更新:好的,以下代码现在可以正常工作。ServicePoint将超时时间设置为接近4分钟。在请求对象上更改ServicePoint.ConnectionLeaseTimeout
意味着请求现在在5000ms后被销毁。感谢大家的帮助,也感谢这两个页面:
- 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
的标签? - ChrisWue