2011-01-16 1 views
8

Я пишу ASP.NET MVC-сайт, который включает в себя возможность для пользователей создавать учетные записи и входить в систему. Так же, как я также хочу, чтобы кешировать сайт агрессивно, Я бегу в некоторые проблемы, связанные с кэшированием с аутентификацией.Дилемма OutputCache с аутентификацией в ASP.NET MVC

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

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

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

Вот некоторые решения, которые я рассматриваю:

  • Установка HttpCacheability или Cache-Control типа в private, а не public. Таким образом, ответ только кэшируется на стороне клиента. Это устранит проблему? Если это произойдет, это повлияет на эффективность кеширования? Однако я заметил, что Stack Overflow использует public.
  • Настройка параметра VaryByCustom для кэширования по-разному для каждого пользователя, например in this tutorial. Будет ли это помогать, сохраняя при этом эффективность и эффективность кеширования?

Заранее благодарен!

ответ

9

В зависимости от структуры вашего приложения может иметь смысл кэшировать данные, а не виды.

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

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