2012-03-29 43 views
6

我有一些代码在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物理缓存的内容在哪里?

+0

以下支持文章你有没有出卖了自己的问题?我有完全相同的问题。 – Chad 2014-07-16 16:20:32

+0

Nope没有解决问题,重新设计了我的解决方案来解决问题。 – 2014-07-21 04:41:01

回答

0

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

尝试设置最大年龄而不是过期时间。

+0

我正在设定最大年龄;已经更新了我上面的示例。 – 2012-04-01 23:12:15

相关问题