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, ни компилятора, так что ожидайте опечаток!

Другие вопросы по тегам