Дилемма OutputCache с аутентификацией в ASP.NET MVC - PullRequest
8 голосов
/ 17 января 2011

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

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

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

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

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

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

Заранее спасибо!

1 Ответ

9 голосов
/ 17 января 2011

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

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

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

...