6

我有一些在 ApiController (ASP.Net Web API) 中运行的代码,它本身想要向另一个 Web 服务发出 GET 请求。Web 服务(也是我的应用程序的一部分)返回 Cache-Control 标头,指示它返回的内容的到期时间。

我正在使用 new System.Net.Http.HttpClient,配置了 aWebRequestHandler以便使用客户端缓存(默认HttpClientHandler不支持缓存配置,尽管它确实System.Net.WebRequest用作其底层 HTTP 实现):

var client = new HttpClient(new WebRequestHandler { 
  UseDefaultCredentials = true,
  CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default)
});
var response = client.GetAsync("someUri").Result;
response.EnsureSuccessStatusCode();

在服务器上,我通过...在我的控制器操作中启用缓存...

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;

上面的(缩写的)代码在测试中可以正常工作;我以这种方式多次调用服务,只有第一个调用实际联系服务(通过 IIS 中服务上的日志消息观察);后续调用使用缓存。

但是,运行托管在 IIS 本身上的相同代码,似乎HttpClient忽略了缓存结果(我还设置了我的 IoC 容器,使得HttpClientAppDomain 中只存在一个实例)并每次调用该服务。这是作为 AppPoolIdentity 运行的。

有趣的是,如果我将应用程序池更改为作为 NetworkService 运行,则响应的状态码为 401 Unauthorized(我尝试过设置Preauthenticate = trueWebRequestHandler状态码仍然是 401)。如果我将应用程序池更改为在我自己的凭据下运行,情况也是如此。

那么,是否有关于在 NetworkService 身份和虚拟 AppPoolIdentity 下运行应用程序池的问题,这会阻止它们使用客户端缓存。WebRequest无论如何,物理 缓存的内容在哪里?

4

2 回答 2

2

在 IIS 上运行时不支持 WinInet 缓存,请查看以下来自 MS 的支持文章http://support.microsoft.com/kb/238425

于 2015-03-06T04:57:39.887 回答
0

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

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

于 2012-03-30T12:25:56.040 回答