仅为匿名用户缓存 ASP.NET 页面

发布于 2024-08-18 07:49:23 字数 161 浏览 6 评论 0原文

有没有一种简单的方法来仅为匿名用户缓存 ASP.NET 整个页面(使用表单身份验证)?

上下文:我正在制作一个网站,其中向匿名用户显示的页面大多是完全静态的,但向登录用户显示的相同页面则不是。

当然,我可以通过后面的代码手动完成此操作,但我认为可能有更好/更简单/更快的方法。

Is there an easy way to cache ASP.NET whole page for anonymous users only (forms authentication used)?

Context: I'm making a website where pages displayed to anonymous users are mostly completely static, but the same pages displayed for logged-in users are not.

Of course I can do this by hand through code behind, but I thought there might be a better/easier/faster way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情归归情 2024-08-25 07:49:23

我正在使用 asp.net MVC,所以我在我的控制器中这样做了

if (User.Identity.IsAuthenticated) {
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
    Response.Cache.SetNoStore();
    Response.Cache.SetNoServerCaching();
}
else {
    Response.Cache.VaryByParams["id"] = true; // this is a details page
    Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString()
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
    Response.Cache.SetCacheability(HttpCacheability.Server);
    Response.Cache.SetValidUntilExpires(true);
}

我这样做的原因(而不是声明式)是我还需要能够通过配置打开和关闭它(此处未显示,但有一个额外检查我的配置变量的 if )。

您仍然需要根据用户名进行更改,否则当出现登录用户时您将不会执行此代码。我的 GetVaryByCustomString 函数在未经身份验证时返回“匿名”,或者在可用时返回用户名。

I'm using asp.net MVC, so I did this in my controller

if (User.Identity.IsAuthenticated) {
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
    Response.Cache.SetNoStore();
    Response.Cache.SetNoServerCaching();
}
else {
    Response.Cache.VaryByParams["id"] = true; // this is a details page
    Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString()
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
    Response.Cache.SetCacheability(HttpCacheability.Server);
    Response.Cache.SetValidUntilExpires(true);
}

The reason I did it this way (instead of declaratively) was I also needed the ability to turn it on and off via configuration (not shown here, but there's an extra check in the if for my config variable).

You still need the vary by username, else you'll not execute this code when a logged in user appears. My GetVaryByCustomString function returns "anonymous" when not authenticated or the users name when available.

怪我入戏太深 2024-08-25 07:49:23

您可以使用VaryByCustom,并使用用户名之类的键。

You could use VaryByCustom, and use a key like username.

半暖夏伤 2024-08-25 07:49:23

没有什么可以阻止您使用所需的行为扩展现有属性,

例如:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    {
       if(filterContext.HttpContext.User.Identity.IsAuthenticated)
          return;

        base.OnActionExecuting(filterContext);
    }  
}  

尚未对此进行测试,但我不明白为什么这不起作用。

There is nothing stopping you from extending the existing attribute with the desired behaviour,

for example:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    {
       if(filterContext.HttpContext.User.Identity.IsAuthenticated)
          return;

        base.OnActionExecuting(filterContext);
    }  
}  

Haven't tested this, but I don't see reason why this shouldn't work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文