Кэширование контента только для неаутентифицированных пользователей - PullRequest
5 голосов
/ 04 февраля 2011

Для веб-сайта я хочу кэшировать страницы ТОЛЬКО для пользователей, которые не прошли проверку подлинности - пользователи, прошедшие проверку подлинности, не получают кэшированный контент (так как они будут обновляться и должны сразу увидеть результаты).

Я знаю, как изменить кэш для каждого пользователя с помощью VaryByCustom: Link1 Link2

... Но я не могу понять, как полностью отключить кэширование для аутентифицированных пользователей.

Что делать?

Редактировать

Приведенный ниже код имеет проблему, если уже существует кэшированная версия страницы от неаутентифицированного пользователя. По существу, аутентифицированному пользователю будет предоставлен неаутентифицированный взгляд на вещи.

Однако эта ссылка имеет решение, которое работает: Ссылка

Ответы [ 4 ]

5 голосов
/ 10 февраля 2011

Используйте это как глобальный фильтр действий.

public class NoCacheForAuthenticatedUsersAttribute: ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if(filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        }
    }
}
3 голосов
/ 13 февраля 2011

Использовать HttpCachePolicy.AddValidationCallback.

См .: http://msdn.microsoft.com/en-us/library/system.web.httpcachepolicy.addvalidationcallback.aspx

2 голосов
/ 06 февраля 2011

Вдохновленный отправленной вами Link1 , так как простая в коде идея состоит в том, что вы можете изменить вывод переопределения GetVaryByCustomString следующим образом:

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg == "IsLoggedIn")
    {
        if (context.Request.Cookies["anon"] != null)
        {
           if (context.Request.Cookies["anon"].Value == "false")
           {
              return "auth";
           }
        }
        return Guid.New().ToString();
    }
    else
    {
        return base.GetVaryByCustomString(context, arg);
    }
}

На самом деле это не ответ, поскольку технически выходные данные аутентифицированного пользователя будут по-прежнему кэшироваться, но они удовлетворяют требованию, чтобы аутентифицированные пользователи видели все результаты сразу. Недостатком является то, что вам нужно поддерживать длительность кэша / TTL достаточно маленькой, чтобы ваш кэш не заполнялся, а был достаточно большим, чтобы анонимные пользователи могли извлечь из этого выгоду.

Другая альтернатива - написать собственный фильтр действий для кэширования и добавить туда поддержку только для анонимного кэширования. Это гораздо больше, однако, на своей собственной территории. См. старый пост Клопфенштейна или Стива Сандерсона по этому вопросу в качестве отправной точки. Им не хватает многих других возможностей OutputCache (например, он использует ключи для всех данных маршрута), но вы можете заставить его работать в соответствии с вашими спецификациями.

0 голосов
/ 04 февраля 2011

Возможно, вы захотите создать два контроллера, один для аутентифицированных пользователей (где вы не кэшируете), другой для не аутентифицированных пользователей (где вы кэшируете).Затем вы можете преломить логику в контроллерах в общий «объект бизнес-уровня», чтобы сохранить ваш код СУХИМЫМ и проверяемым по модулю.

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