HTTP-запрос перезапускает интернет-соединение
Недавно я начал разрабатывать веб-API для своего приложения для Windows Phone 8, и когда я пытаюсь подключить его к своему приложению (через WebClient, HttpRequest и HttpClient), он заканчивается таким же образом, просто отключается мое интернет-соединение без какой-либо информации. Сайт, на который я пытаюсь попасть, 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");
}
}
Оба должны вернуть этот результат:
[{"_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}]
Но когда любой запрос пытается получить этот результат, он просто завершается сбросом интернет-соединения, без каких-либо сообщений, предупреждений или исключений. Единственное, что я мог получить от отладчика, это информация о том, что запрос получил код состояния 404.
Любой другой сервис веб-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);
Имейте в виду, что я написал это без intellisense, ни компилятора, так что ожидайте опечаток!