WebRequest.CachePolicy 是不是应该在 IIS 中运行的代码中工作?

Posted

技术标签:

【中文标题】WebRequest.CachePolicy 是不是应该在 IIS 中运行的代码中工作?【英文标题】:Should WebRequest.CachePolicy work from code running within IIS?WebRequest.CachePolicy 是否应该在 IIS 中运行的代码中工作? 【发布时间】:2012-03-29 04:01:05 【问题描述】:

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

我正在使用新的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 下运行应用程序池是否有一些问题,这会阻止它们使用客户端缓存。 WebRequest 缓存的内容到底在哪里?

【问题讨论】:

你卖过你的问题吗?我遇到了完全相同的问题。 不,没有解决问题,重新设计了我的解决方案来解决它。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我实际上是在设置 max-age;更新了我上面的例子。

以上是关于WebRequest.CachePolicy 是不是应该在 IIS 中运行的代码中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象是不是不是数组?

GetKeyState() 是不是检测到密钥是不是被释放?

“滚动” FFT 是不是可能,是不是有用?

如何检测图像是不是不是由 iPhone 相机拍摄的?

Python:检查对象是不是不是“数组类型”

JS判断是不是为数字,是不是为整数,是不是为浮点数