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

Posted

技术标签:

【中文标题】System.Net.Http.HttpClient 添加 If-Modified-Since 标头【英文标题】:System.Net.Http.HttpClient adding If-Modified-Since header 【发布时间】:2016-04-02 12:51:30 【问题描述】:

我正在尝试从 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 build 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 标头正确地导致谷歌返回304 - not modified,所以我没有得到任何 json 文件。问题是我没有添加该标题,也无法弄清楚它是在哪里添加以及如何停止它。

在某种情况下会出现这种情况,如果是的话,如何控制这种行为。

【问题讨论】:

你在代理下吗? @cleiton 我不是。感觉 uwp 应用程序不正确地使用了某些缓存 如果你使用Windows.Web.Http.HttpClient而不是System.Net.Http.HttpClient会有区别吗? @Clemens - 是的,使用 Windows.Web.Http 客户端的行为相同。 我不确定这里发生了什么,但重新启动后它就消失了。 【参考方案1】:

这一定是 System.Net.Http.HttpClient 在带有 .NET CoreWindows 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();

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

【讨论】:

以上是关于System.Net.Http.HttpClient 添加 If-Modified-Since 标头的主要内容,如果未能解决你的问题,请参考以下文章