HTTP 请求重新启动 Internet 连接

Posted

技术标签:

【中文标题】HTTP 请求重新启动 Internet 连接【英文标题】:HTTP request restarts Internet connection 【发布时间】:2014-07-28 15:29:15 【问题描述】:

最近我开始为我的 windows phone 8 应用程序开发 Web API,当我尝试将它连接到我的应用程序(通过 WebClient、HttpRequest 和 HttpClient)时,它以相同的方式结束,只是在没有任何信息的情况下断开我的 Internet 连接。我要访问的站点是gtlol.necroworks.net/free。还有其他人遇到过类似情况和/或找到任何答案吗?

更多说明:

HttpClient 和 WebClient 请求示例:

//HttpClient example
using (HttpClient hc = new HttpClient())

   hc.BaseAddress = new Uri("http://gtlol.necroworks.net/");

   HttpResponseMessage response = await hc.GetAsync("free");
   if (response.IsSuccessStatusCode)
   
       var res = await response.Content.ReadAsStringAsync();
       MessageBox.Show(res);
   
   else
   
       MessageBox.Show("Not working - no internet connection");
   


//WebClient example
WebClient freeRotationWebClient = new WebClient();
freeRotationWebClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_GetRotation);
freeRotationWebClient.DownloadStringAsync(new Uri("http://gtlol.necroworks.net/free"));

private void webClient_GetRotation(object sender, DownloadStringCompletedEventArgs e)

    try
    
        if (!e.Cancelled)
        
            MessageBox.Show((string)e.Result);
        
    
    catch (Exception ex)
    
        MessageBox.Show("Not working");
    

两个 em 都应该返回这个结果:

["_id":"53d264aa6e65634e49000000","champId":53,"_id":"53d264ab6e65634e49010000","champId":36,"_id":"53d264ab6e65634e49020000","champId":79,"_id":"53d264ab6e65634e49030000","champId":96,"_id":"53d264ab6e65634e49040000","champId":75,"_id":"53d264ab6e65634e49050000","champId":72,"_id":"53d264ac6e65634e49060000","champId":48,"_id":"53d264ac6e65634e49070000","champId":6,"_id":"53d264ac6e65634e49080000","champId":101,"_id":"53d264ac6e65634e49090000","champId":115]

但是,当任何请求尝试获得此结果时,它只会以 Internet 连接重置结束,没有任何消息或任何警告或任何异常。我能从调试器中得到的唯一信息是请求的状态码为 404。

我使用的任何其他 Web API 服务都可以正常工作。

我注意到我从我的 api 获得的标头是:

Accept-Ranges →bytes
Age →0
Connection →keep-alive
Content-Length →482
Content-Type →application/json;charset=utf-8
Date →Wed, 30 Jul 2014 18:44:45 GMT
Server →nginx
Via →1.1 varnish
X-Content-Type-Options →nosniff
X-Varnish →584616320

我要缓存的 api 在哪里使用:

Access-Control-Allow-Headers →Content-Type
Access-Control-Allow-Methods →GET, POST, DELETE, PUT
Access-Control-Allow-Origin →*
Connection →keep-alive
Content-Encoding →gzip
Content-Length →161
Content-Type →application/json; charset=UTF-8
Date →Wed, 30 Jul 2014 18:45:13 GMT
Server →Jetty(9.1.1.v20140108)
Vary →Accept-Encoding, User-Agent
X-NewRelic-App-Data →#string of chars here

【问题讨论】:

【参考方案1】:

您从公共 HTTP 缓存而不是您的源服务器获得响应。缓存(Varnish)可能已经存储了先前 404 响应的副本,并且现在很高兴地为响应您的请求提供服务,并且将继续直到响应变得陈旧。这需要多长时间取决于服务器设置的 max-age/expires。

您可以尝试在请求中添加一个缓存控制标头,表明您不想获得缓存响应。试试看,

var request = new HttpRequestMessage() 
                             RequestUri = new Uri("free",UriKind.RelativeOrAbsolute)
                          ; 
request.Headers.CacheControl = new CacheControlHeader() NoCache=true;
HttpResponseMessage response = await hc.SendAsync(request);

请注意,我在没有智能感知和编译器的情况下编写了此代码,因此请注意拼写错误!

【讨论】:

以上是关于HTTP 请求重新启动 Internet 连接的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何处理 twisted.application.internet.ClientService 中的重新连接?

频道应用程序无故停止工作 unitil ASGI 服务器重新启动

安装了IIS后,输入http://localhost和127.0.0.1怎么都打不开,显示HTTP 500 - 内部服务器错误 Internet Exp

一个TCP连接上为啥能发起多少个HTTP请求?

渠道应用程序停止工作,没有任何理由单元ASGI服务器重新启动

更改请求标头 SOCKET.IO(无需断开连接和重新连接)