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

时间:2010-01-17 16:22:05

标签: asp.net caching forms-authentication

是否有一种简单的方法可以仅为匿名用户缓存ASP.NET整页(使用表单身份验证)?

背景信息:我正在建立一个网站,向匿名用户显示的页面大多是完全静态的,但是为登录用户显示的页面不是。

当然,我可以手动完成代码,但我认为可能有更好/更容易/更快的方式。

3 个答案:

答案 0 :(得分:3)

我正在使用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);
}

我这样做的原因(而不是声明性的)是我还需要能够通过配置打开和关闭它(这里没有显示,但是在我的配置变量中有一个额外的检查)。 p>

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

答案 1 :(得分:1)

您可以使用VaryByCustom,并使用username等密钥。

答案 2 :(得分:1)

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

例如:

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

        base.OnActionExecuting(filterContext);
    }  
}  

Haven没有对此进行测试,但我不明白为什么这不应该起作用。