Кеш только для штатных не для зарегистрированных пользователей ASP.NET MVC - PullRequest
1 голос
/ 20 марта 2012

Я кеширую разные версии на сервере некоторых страниц, используя профиль кеша, для разных версий я использую параметр VaryByCustom, который перегружен и возвращает одну версию для зарегистрированного пользователя, а другую - для обычной.Как оказалось, у моих зарегистрированных пользователей скоро будет совсем другая информация на странице.Мой вопрос, можно ли сказать, если пользователь зарегистрирован, чем ничего не кэшировать?

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Вы можете попробовать это:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if ("User".Equals(custom, StringComparison.OrdinalIgnoreCase))
    {
        if (!string.IsNullOrWhiteSpace(Thread.CurrentPrincipal.Identity.Name))
            return Guid.NewGuid().ToString(); // do not cache anything
        return string.Empty; // cache for non-signed-in users
    }
    return base.GetVaryByCustomString(context, custom);
}

Ответ на комментарий

GUID является уникальным глобальным идентификатором.Каждый раз, когда вы вызываете Guid.NewGuid().ToString(), вы получаете чертовски уникальную строку. Технически результат все еще будет кэшироваться , однако он будет кэшироваться с использованием уникальной строки.Таким образом, вероятность того, что 2 подписанных пользователя когда-либо увидят один и тот же кэшированный результат, крайне мала.На самом деле, вероятность того, что один и тот же вошедший в систему пользователь когда-либо увидит кэшированный результат для страницы, невелика.

Другой подход, если вы вообще не хотите ничего кэшировать, состоит в том, чтобы реализовать кэширование вручную.,Тем не менее, я не думаю, что вы можете сказать методу действия «кэшировать для не подписанных пользователей, но не кэшировать для зарегистрированных пользователей», используя OutputCacheAttribute.

0 голосов
/ 22 апреля 2012

Как выяснилось, вы можете остановить кэширование для вошедшего в систему пользователя, реализовав собственный поставщик кэширования, в котором вы можете использовать метод Add, Set, Remove для предотвращения кэширования чего-либо. Также вы можете очень кешировать провайдеров пользователем в global.asax. Единственная причина, по которой я никогда не использовал этот подход, заключается в том, что мне все еще требовалось кэширование некоторых страниц для пользователя, и я не нашел способа узнать, каков текущий профиль кэширования в классе провайдера кэширования, чтобы я мог кэшировать или не кэшировать на основе профиль. Если по какой-то причине вы просто хотите запретить кэширование подписанного пользователя на каждой странице, я думаю, что это лучший подход, а затем измените его с помощью GUID.

...