WebRequest.CachePolicy应该在IIS中运行的代码中运行吗?

时间:2012-03-29 04:01:06

标签: c# webrequest asp.net-web-api dotnet-httpclient

我在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缓存的内容实际存在于何处?

2 个答案:

答案 0 :(得分:2)

在IIS上运行时不支持WinInet缓存,请查看MS http://support.microsoft.com/kb/238425

中的以下支持文章

答案 1 :(得分:0)

我没有看到为什么缓存不能在IIS下工作的任何原因。缓存由WinINetProxy实现,与Internet Explorer使用的缓存相同。

尝试设置max-age而不是到期时间。