System.Net.Http.HttpClient添加If-Modified-Since标头

时间:2015-12-28 16:54:23

标签: c# .net uwp dotnet-httpclient if-modified-since

我试图从Windows通用应用程序发出一个Http Get请求并看到一个奇怪的行为。 (不确定它是否是一个通用应用程序的事实是否相关)。

有问题的简化代码是:

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 10内部版本10240的通用Windows应用程序)中,原始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文件。问题是我没有添加标题,也无法弄清楚它的添加位置以及如何停止它。

是否存在预期的情况,如果有,则如何控制该行为。

1 个答案:

答案 0 :(得分:1)

这必须是System.Net.Http.HttpClient使用 .NET Core Windows 10 Windows.Web.Http.HttpClient之上的副作用。控制台应用仍然使用常规的 .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();

请务必卸载并重新安装您的应用以清理互联网缓存。