我有一些代码在ApiController(ASP.Net Web API)中运行,它本身想要对另一个Web服务发出GET请求。 Web服务(也是我的应用程序的一部分)返回Cache-Control标题,指示它返回内容的到期时间。WebRequest.CachePolicy应该从在IIS内运行的代码工作吗?
我现在用的是新System.Net.Http.HttpClient
,具有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();
在我通过我的控制器操作中启用缓存服务器...
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容器,使AppDomain中只存在HttpClient
的一个实例)并调用每个服务时间。这是作为AppPoolIdentity运行的。有趣的是,如果我将应用池更改为NetworkService运行,那么响应的状态码为401 Unauthorized(我试图在WebRequestHandler
上设置Preauthenticate = true
,但状态码仍为401)。如果我将应用程序池更改为在我自己的凭据下运行,情况也是如此。
那么,在NetworkService身份和虚拟AppPoolIdentity下运行App Pool会有什么不便,它们会阻止它们使用客户端缓存。无论如何,由WebRequest
物理缓存的内容在哪里?
以下支持文章你有没有出卖了自己的问题?我有完全相同的问题。 – Chad 2014-07-16 16:20:32
Nope没有解决问题,重新设计了我的解决方案来解决问题。 – 2014-07-21 04:41:01