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 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();
请务必卸载并重新安装您的应用以清理 Internet 缓存。
【讨论】:
以上是关于System.Net.Http.HttpClient 添加 If-Modified-Since 标头的主要内容,如果未能解决你的问题,请参考以下文章