C# HttpWebRequest.GetResponse()随机挂起
我有以下代码:C# HttpWebRequest.GetResponse()随机挂起,c#,http,C#,Http,我有以下代码: public static QHttpResponse Execute(QHttpRequest request) { //Setup the request HttpWebRequest webrequest = (HttpWebRequest) WebRequest.Create(request.GetFinalUrl()); webrequest.AllowAutoRedirect = request.IsAllowRedirects; we
public static QHttpResponse Execute(QHttpRequest request)
{
//Setup the request
HttpWebRequest webrequest = (HttpWebRequest) WebRequest.Create(request.GetFinalUrl());
webrequest.AllowAutoRedirect = request.IsAllowRedirects;
webrequest.Method = request.Method;
webrequest.Accept = "application/json, text/javascript;q=0.9, */*;q=0.5";
webrequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
//request.Host is set automatically
webrequest.UserAgent = request.UserAgent;
if (!String.IsNullOrEmpty(request.Referrer))
webrequest.Referer = request.Referrer;
webrequest.Timeout = 50000;
webrequest.KeepAlive = false;
webrequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Revalidate);
webrequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
if (request.IsAjax)
{
webrequest.Headers.Add("X-Request", "JSON");
webrequest.Headers.Add("X-Requested-With", "XMLHttpRequest");
webrequest.Headers.Add("X-Prototype-Version", "1.7");
}
// Cookies
webrequest.CookieContainer = request.Cookies;
// Write the data to the body for POST and other methods
if (request.IsMethodPost())
{
byte[] dataBytes = Encoding.UTF8.GetBytes(request.GetDataParamString());
webrequest.ContentLength = dataBytes.Length;
using (Stream requestStream = webrequest.GetRequestStream())
requestStream.Write(dataBytes, 0, dataBytes.Length);
}
// Get the response
HttpWebResponse webresponse;
try
{
webresponse = webrequest.GetResponse() as HttpWebResponse;
}
catch (WebException wex)
{
if(request.IsBypassError)
webresponse = wex.Response as HttpWebResponse;
else
throw;
}
// Read to QHttpResponse object
QHttpResponse response = new QHttpResponse();
response.StatusCode = webresponse.StatusCode;
response.NewCookies = webresponse.Cookies;
using (Stream responseStream = webresponse.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
response.Reply = reader.ReadToEnd();
webresponse.Close();
return response;
}
我让这段代码从不同的位置随机运行多次(每两个小时),它挂起在这行:
webresponse = webrequest.GetResponse() as HttpWebResponse;
我尝试设置webrequest.KeepAlive=false代码>,但我继续收到错误
我想要任何关于解决这个问题的可用帮助,提前谢谢
编辑:我想补充一点,这段代码是从两个线程执行的。有时,它们可能连接到同一主机,但只能从这两个线程连接。另外,正如我所看到的,响应被适当地关闭
编辑2:VisualStudio的调试器说执行被卡在了System.dll!System.Net.Sockets.Socket.Receive
编辑3:为了准确查看导致错误的原因,我将“获取响应”代码从上面修改为
// Get the response
HttpWebResponse webresponse = null;
try
{
webresponse = webrequest.GetResponse() as HttpWebResponse;
}
catch (WebException wex)
{
Console.WriteLine("Time : " + DateTime.Now);
Console.WriteLine("Thread name : " + Thread.CurrentThread.Name);
Console.WriteLine("Exception : " + wex);
Console.WriteLine("Exc msg : " + wex.Message);
Console.WriteLine("Url : " + request.GetFinalUrl());
if (request.IsBypassError)
webresponse = wex.Response as HttpWebResponse;
else
{
if (webresponse != null)
{
webresponse.Close();
webresponse.Dispose();
}
throw;
}
}
我收到了以下输出:
Time : 5/11/2015 3:13:35 AM
Thread name : BOT A
Exception : System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
at System.Net.HttpWebRequest.GetResponse()
at Gameloop.Util.Web.QWebClient.Execute(QHttpRequest request) in e:\Visual Studio - Workspace\Gameloop.Util\Gameloop.Util\Web\QWebClient.cs:line 52
Exc msg : The remote server returned an error: (500) Internal Server Error.
Url : https://website1.com/url/path/to/something (I changed this)
这是唯一显示的错误,线程“BOT A”遇到了该错误。然而,这并不是线程实际冻结的url。“机器人A”实际上是在下午12点在website2.com被冻结的,“机器人B”实际上是在早上7点在website3.com被冻结的。我怀疑挂起与异常有很大关系,因为在实际挂起之前,请求会在挂起之后多次发出。我的第一个倾向是,您可能需要处理您的HttpWebResponse
。通常,您可以使用
块将其包装在中,但由于有两个位置可以指定webresponse
,因此您可能只需要显式地处理它,如下所示
webresponse.Close();
webresponse.Dispose();
我将从这里开始。只需在try块中添加以下内容:
httpWReq.Timeout = 3000;
我建议在webresponse.Close()
之后立即调用webresponse.Dispose()
,然后再试一次。我会这样做的,请注意可能需要几天时间才能确认您的技术(尤其是如果它有效的话)更好,请使用块将webresponse放入中。我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。我会尝试扩大您的网络以捕获所有异常,而不仅仅是WebExceptions。只是再次收到相同的错误。考虑到错误发生的频率似乎有所降低,我认为添加Dispose()可能有所帮助,但并没有解决问题。我已经为这个问题添加了更多细节。你能看到你的HttpWebRequest
的属性是什么吗?可能是其中一个属性设置不正确。我不太明白。。。您的意思是说没有设置其中一个HttpWebRequest属性,就像System.dll中的错误一样?我该如何检查这一点?我想这取决于错误的表现方式。如果它抛出异常,可以在catch语句中将值写入日志。如果它确实只是无限期地挂起,那么您可能希望在调用GetResponse()
之前将属性写入日志。网络就位后,下次崩溃时我会发回。