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

Jam*_*ter 6 c# webrequest asp.net-web-api dotnet-httpclient

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

我正在使用new System.Net.Http.HttpClient,配置了a WebRequestHandler以便使用客户端缓存(默认情况下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();
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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

有趣的是,如果我将应用程序池更改为以NetworkService身份运行,则响应的状态代码为401 Unauthorized(我已尝试设置Preauthenticate = true,WebRequestHandler但状态代码仍为401).如果我将应用程序池更改为在我自己的凭据下运行,情况也是如此.

那么,是否存在关于在NetworkService身份下运行App Pool以及虚拟AppPoolIdentity阻止他们使用客户端缓存的问题.WebRequest无论如何,内容缓存的内容在哪里?

Wol*_*and 2

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