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