2013-03-19 6 views
2

Я хотел бы кэшировать выходные данные своих действий MVC. Однако:Кэширование вывода действий MVC, но использование кешированной версии только для аутентифицированных пользователей

1) Если я применяю OutputCacheAttribute во всем мире, это опасно, поскольку он кэширует все для всех пользователей.

2) Если я применил OutputCacheAttribute по всему миру, а затем применил атрибут Authorize к тем действиям, требующим авторизации, которые все еще не решают проблему. Все выходные данные кэшируются независимо от того, был ли пользователь авторизован или нет.

3) Если я применил OutputCacheAttribute (не глобально, но) только при определенных действиях, и у вас есть AuthorizeAttribute для всех действий, требующих авторизации, тогда нет угрозы безопасности, но есть стоимость исполнения. Каждая страница, требующая проверки подлинности, должна будет сделать новый запрос Http.

Я хочу найти среднюю землю, чтобы выбранные страницы и/или выбранные типы запросов (HTTP GET) были кешированы на клиенте, но только если пользователь аутентифицирован. Если пользователь выходит из системы и обращается к URL-адресу кешированной страницы/действия, он не должен видеть содержимое.

Есть ли способ реализовать это?

ответ

2

VaryByCustom is what you want. Поместите это в файле Global.asax:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    // use this algorithm to determine cacheability for "IsAuthenticated" 
    if ("IsAuthenticated".Equals(custom, StringComparison.OrdinalIgnoreCase)) 
    { 
     // cache content when user is authenticated 
     if (User.Identity.IsAuthenticated) return "true"; 

     // do not cache when user is not authenticated 
     return null; 
    } 

    return base.GetVaryByCustomString(context, custom); 
} 

... затем использовать что-то вроде этого на методе действий вы хотите кэшировать:

[OutputCache(VaryByCustom = "IsAuthenticated", Duration = 1800, 
    Location = OutputCacheLocation.Client)] 
public virtual ActionResult Index() 
{ ... } 
+0

-1 на самом деле? Я просто тестировал это, и он работает. Неавторизованные пользователи получают новую копию сервера по каждому запросу, а аутентифицированные пользователи получают кешированную копию. Это точно так же, как мой предыдущий ответ без фактического кода. – danludwig

 Смежные вопросы

  • Нет связанных вопросов^_^