System.Net.Http.HttpClient, добавляющий заголовок If-Modified-Since

Я пытаюсь отправить запрос Http Get из универсального приложения Windows и вижу странное поведение. (не уверен, что тот факт, что это универсальное приложение, связан или нет).

Упрощенный код, о котором идет речь, таков:

var client = new HttpClient();
var response = await client.GetAsync("https://storage.googleapis.com/pictureframe/settings.json");
var s = await response.Content.ReadAsStringAsync();

В модульном тесте или консольном приложении, которое работает должным образом, а переменная s содержит содержимое json.

Однако в приложении, куда я пытаюсь добавить этот код (универсальное приложение для Windows, предназначенное для Windows 10, сборка 10240), необработанный http-запрос выглядит следующим образом:

GET https://storage.googleapis.com/pictureframe/settings.json HTTP/1.1
Host: storage.googleapis.com
If-Modified-Since: Sun, 27 Dec 2015 18:00:08 GMT
If-None-Match: "5c43f7f07270bda3b7273f1ea1d6eaf7"
Connection: Keep-Alive

Заголовок If-Modified-Since правильно заставляет Google возвращать 304 - not modified, поэтому я не получаю файл json. Дело в том, что я не добавляю этот заголовок и не могу понять, где он добавляется и как это остановить.

Есть ли обстоятельства, при которых это можно было бы ожидать, и если да, то как можно контролировать такое поведение.


person dkackman    schedule 28.12.2015    source источник
comment
Вы под прокси?   -  person Cleiton    schedule 28.12.2015
comment
@cleiton Я не такой. Такое ощущение, что приложение uwp неправильно использует какой-то кеш   -  person dkackman    schedule 28.12.2015
comment
Есть ли разница, если вы используете Windows.Web.Http.HttpClient вместо System.Net.Http.HttpClient?   -  person Clemens    schedule 28.12.2015
comment
@Clemens - да, такое же поведение при использовании клиента Windows.Web.Http.   -  person dkackman    schedule 28.12.2015
comment
Я не уверен, что здесь происходит, но перезагрузка заставила это уйти.   -  person dkackman    schedule 28.12.2015


Ответы (1)


Это должно быть побочным эффектом того, что System.Net.Http.HttpClient находится поверх Windows.Web.Http.HttpClient в Windows 10 с .NET Core. Консольные приложения по-прежнему используют обычную .NET Framework.

Поскольку нет возможности управлять кешем с помощью System.Net.Http.HttpClient/HttpClientHandler, а System.Net.Http.WebRequestHandler недоступен для приложений UWP, я рекомендую вам переключиться на Windows.Web.Http.

Затем попробуйте:

var filter = new HttpBaseProtocolFilter();

// Disable cache of responses.
filter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.NoCache;

// Pass filter to HttpClient constructor.
var client = new HttpClient(filter);

var response = await client.GetAsync(new Uri("http://example.com"));
var responseString = await response.Content.ReadAsStringAsync();

Обязательно удалите и переустановите приложение, чтобы очистить интернет-кеш.

person kiewic    schedule 28.12.2015