我有以下代码:
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:Visual的调试器表示执行在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。"BOT A“实际上是在晚上12点在website2.com被冻结的,而"BOT B”实际上是在早上7:00在website3.com被冻结的。我怀疑绞刑与例外情况有很大关系,因为在实际挂起之前,这些请求会被提出很多次。
发布于 2015-05-07 01:42:33
我的第一个倾向是,您可能需要释放您的HttpWebResponse。通常,您可能会将其包装在一个using块中,但是由于您有两个可能分配webresponse的位置,所以您可能只想显式地释放它,如下所示。
webresponse.Close();
webresponse.Dispose();我会从那里开始。
发布于 2017-02-18 19:07:31
只需在try块中添加以下内容:
httpWReq.Timeout = 3000;https://stackoverflow.com/questions/30090361
复制相似问题