gpt4 book ai didi

asp.net - ASP.NET 中的条件输出缓存

转载 作者:行者123 更新时间:2023-12-04 20:22:30 24 4
gpt4 key购买 nike

我有一个关于如何以编程方式指示 ASP.NET 跳过解析来自输出缓存的请求的问题。

想象一下,您通过在运行时将缓存策略设置从 CMS 应用到 HttpResponse 来缓存页面输出(例如 http://domain/page.aspx )。在 根据请求 取决于即当前用户已通过身份验证 + 一组已知组的成员(或由业务逻辑匹配),我想指示 ASP.NET 跳过 解析来自输出缓存的请求。

场景是两个不同的用户同时(或更多)在系统上。用户 A 是经过身份验证的 + 一组已知组的成员,而用户 B 是匿名的。无论输出缓存的页面如何,我都希望经过身份验证的用户浏览所有页面,就好像没有启用输出缓存一样——永远;同时,我希望 ASP.NET 继续为匿名用户(或业务逻辑不匹配的用户)提供输出缓存页面。

典型的建议是使用 VaryByHeader、VaryByParam 等并污染输出缓存 - 不好,但是在使用 Reflector 挖掘输出缓存模块时,我注意到输出缓存模块会跳过当前请求,以防几个已知的“缓存” -control”标题存在。就我所关心的标题而言,如果用户通过在地址栏中按 F5 或 ENTER 来强制呈现新副本,则这些标题是从浏览器发送的。

因此,我所做的只是在输出缓存订阅的 ResolveRequestCache 事件之前的事件中将自定义 http 模块中的“缓存控制” header 设置为“无缓存”。像这样:

context.Request.Headers["Cache-Control"] = "no-cache";

一切都很好,但是,如果设置了 HttpCachePolicy.SetValidUntilExpires(true) 缓存策略,ASP.NET 将忽略先前设置的请求 header 并从输出缓存中处理请求。

作为替代方案,我想我可以在同一个 http 模块的后处理事件中编写附加代码,以确保调用 HttpCachePolicy.SetValidUntilExpires(false),以防已配置输出缓存,但我认为这将是一个更干净的解决方案实际上能够指示 ASP.NET 简单地跳过从输出缓存中解析请求。我可以想象这个问题有很多公认的解决方案,但我追求的是正确的。

作为引用,我一直在尝试 HttpCachePolicy 类的大多数(如果不是所有)相关方法,例如:
HttpResponse.Cache.SetNoServerCaching()).

最佳答案

您可以添加 HttpCacheValidateHandler到您的应用程序,您可以在其中实现您想要的任何逻辑。它将在 ResolveRequestCache 期间执行。执行身份验证和授权后触发的事件。关键是返回HttpValidationStatus.IgnoreThisRequest在您想绕过缓存的情况下。

请参阅此示例 HttpModule 以供引用:

public class CacheModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest +=
(s, e) => context.Context.Response.Cache
.AddValidationCallback(CacheHandler, null);
}

private static void CacheHandler(
HttpContext context, object data,
ref HttpValidationStatus validationstatus)
{
// bypass cache for all users with skipCache cookie
validationstatus =
context.Request.Cookies["skipCache"] != null
? HttpValidationStatus.IgnoreThisRequest
: HttpValidationStatus.Valid;
}

public void Dispose()
{
}
}

关于asp.net - ASP.NET 中的条件输出缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4837458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com