Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest.GetResponse()随机挂起_C#_Http - Fatal编程技术网

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()
之前将属性写入日志。网络就位后,下次崩溃时我会发回。