我在ApiController(ASP.Net Web API)中运行了一些代码,它本身想要向另一个Web服务发出GET请求。 Web服务(也是我的应用程序的一部分)返回Cache-Control标头,指示它返回的内容的到期时间。
我正在使用配置了System.Net.Http.HttpClient
的新WebRequestHandler
以使用客户端缓存(默认HttpClientHandler
不支持缓存配置,尽管它确实使用{{ 1}}作为其底层HTTP实现):
System.Net.WebRequest
在服务器上,我通过...
在我的控制器操作中启用缓存var client = new HttpClient(new WebRequestHandler {
UseDefaultCredentials = true,
CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default)
});
var response = client.GetAsync("someUri").Result;
response.EnsureSuccessStatusCode();
上述(缩写)代码在测试中正常工作;我以这种方式多次调用服务,只有第一个调用实际联系服务(通过IIS中服务的日志消息观察);后续调用使用缓存。
但是,运行在IIS本身上托管的相同代码,似乎var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.CacheControl = new CacheControlHeaderValue {
Public = true,
MaxAge = new TimeSpan(0, 5, 0); // Five minutes in this case
};
// Omitted, some content is added to the response
return response;
忽略了缓存结果(我还设置了我的IoC容器,以便只有HttpClient
的一个实例存在于AppDomain)并且每次都调用该服务。这是作为AppPoolIdentity运行的。
有趣的是,如果我将应用程序池更改为以NetworkService身份运行,则响应的状态代码为401 Unauthorized(我已尝试在HttpClient
上设置Preauthenticate = true
但状态代码仍为401。如果我将应用程序池更改为以我自己的凭据运行,情况也是如此。
那么,是否存在关于在NetworkService身份下运行App Pool以及虚拟AppPoolIdentity阻止他们使用客户端缓存的问题。无论如何,WebRequestHandler
缓存的内容实际存在于何处?
答案 0 :(得分:2)
在IIS上运行时不支持WinInet缓存,请查看MS http://support.microsoft.com/kb/238425
中的以下支持文章答案 1 :(得分:0)
我没有看到为什么缓存不能在IIS下工作的任何原因。缓存由WinINetProxy实现,与Internet Explorer使用的缓存相同。
尝试设置max-age而不是到期时间。