【发布时间】:2011-06-17 18:30:44
【问题描述】:
我有一个关于如何以编程方式指示 ASP.NET 跳过从输出缓存解析请求的问题。
假设您通过在运行时将缓存策略设置从 CMS 应用到 HttpResponse 来缓存页面输出(例如 http://domain/page.aspx)。在每个请求的基础上,取决于即当前用户已通过身份验证 + 一组已知组的成员(或由业务逻辑匹配),我想指示 ASP.NET 跳过 从输出缓存解析请求。
场景是两个不同的用户同时(或更多)在系统上。用户 A 是经过身份验证的 + 一组已知组的成员,而用户 B 是匿名的。无论输出缓存的页面是什么,我都希望经过身份验证的用户浏览所有页面,就好像没有启用输出缓存一样——永远;同时,我希望 ASP.NET 继续为匿名用户(或业务逻辑不匹配的用户)提供输出缓存页面。
典型的建议是使用 VaryByHeader、VaryByParam 等并污染输出缓存 - 不好,但是在使用 Reflector 挖掘输出缓存模块时,我注意到输出缓存模块会跳过当前请求,以防出现几个存在已知的“缓存控制”标头。就我所关心的标题而言,如果用户通过在地址栏中按 F5 或 ENTER 来强制呈现新副本,则这些标题是从浏览器发送的。
所以,我所做的只是在输出缓存订阅的 ResolveRequestCache 事件之前的事件中将自定义 http 模块中的“缓存控制”标头设置为“无缓存”。像这样:
context.Request.Headers["Cache-Control"] = "no-cache";
一切都很好,但是,如果设置了 HttpCachePolicy.SetValidUntilExpires(true) 缓存策略,ASP.NET 将忽略先前设置的请求标头并从输出缓存中处理请求。
作为替代方案,我想我可以在同一个 http 模块中的后处理事件中编写附加代码,以确保调用 HttpCachePolicy.SetValidUntilExpires(false),以防已配置输出缓存,但我认为它会是一个更干净的解决方案,实际上能够指示 ASP.NET 简单地跳过解析来自输出缓存的请求。我可以想象这个问题有很多公认的解决方案,但我追求的是正确的。
作为参考,我一直在尝试 HttpCachePolicy 类的大部分相关方法(如果不是全部),例如:
HttpResponse.Cache.SetNoServerCaching()).
【问题讨论】:
标签: asp.net caching outputcache