首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpWebRequest.GetResponse()随机挂起

HttpWebRequest.GetResponse()随机挂起
EN

Stack Overflow用户
提问于 2015-05-07 01:22:57
回答 2查看 2.9K关注 0票数 2

我有以下代码:

代码语言:javascript
复制
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;
}

我让这个代码从不同的位置运行多次,随机地(每隔几个小时),它挂在下面一行:

代码语言:javascript
复制
webresponse = webrequest.GetResponse() as HttpWebResponse;

我尝试设置webrequest.KeepAlive = false;,但是我继续收到错误。

在解决这个问题上,我想要任何有帮助的人,谢谢。

编辑:我想补充一下,这段代码是从两个线程执行的。有时,它们可能连接到同一个主机,但只能从这两个线程连接。而且,正如我所看到的,响应是适当关闭的。

编辑2:Visual的调试器表示执行在System.dll!System.Net.Sockets.Socket.Receive上确实是卡住了。

编辑3:为了查看究竟是什么导致了错误,我将“获取响应”代码从上面修改为

代码语言:javascript
复制
// 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;
    }
}

我收到了这个输出:

代码语言:javascript
复制
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被冻结的。我怀疑绞刑与例外情况有很大关系,因为在实际挂起之前,这些请求会被提出很多次。

EN

回答 2

Stack Overflow用户

发布于 2015-05-07 01:42:33

我的第一个倾向是,您可能需要释放您的HttpWebResponse。通常,您可能会将其包装在一个using块中,但是由于您有两个可能分配webresponse的位置,所以您可能只想显式地释放它,如下所示。

代码语言:javascript
复制
webresponse.Close();
webresponse.Dispose();

我会从那里开始。

票数 1
EN

Stack Overflow用户

发布于 2017-02-18 19:07:31

只需在try块中添加以下内容:

代码语言:javascript
复制
httpWReq.Timeout = 3000;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30090361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档