Страница кэша ASP.NET только для анонимных пользователей - PullRequest
5 голосов
/ 17 января 2010

Существует ли простой способ кэширования всей страницы ASP.NET только для анонимных пользователей (используется проверка подлинности с помощью форм)?

Контекст: я создаю веб-сайт, на котором страницы, отображаемые анонимным пользователям, в основном полностью статичны, но те же страницы, которые отображаются для вошедших в систему пользователей, не являются.

Конечно, я могу сделать это вручную с помощью кода, но я подумал, что может быть лучше / проще / быстрее.

Ответы [ 3 ]

3 голосов
/ 16 сентября 2011

Я использую 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 для моей переменной config).

Вам все еще нужно изменить имя пользователя, иначе вы не будете выполнять этот код, когда появится зарегистрированный пользователь. Моя функция GetVaryByCustomString возвращает «анонимный», если он не прошел проверку подлинности, или имя пользователя, когда оно доступно.

1 голос
/ 02 мая 2015

Ничто не мешает вам расширить существующий атрибут требуемым поведением,

например:

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

        base.OnActionExecuting(filterContext);
    }  
}  

Не проверял это, но я не вижу причин, почему это не должно работать.

1 голос
/ 17 января 2010

Вы можете использовать VaryByCustom и использовать клавишу типа username.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...