2011-01-16 6 views
8

Piszę witrynę ASP.NET MVC, która zawiera możliwość tworzenia kont i logowania użytkowników. Ponieważ chcę również agresywnie buforować stronę, Używam w pewne kłopoty z mieszaniem pamięci podręcznej z uwierzytelnianiem.Dylemat OutputCache z uwierzytelnianiem w ASP.NET MVC

Na każdej stronie, na górze, jeśli użytkownik jest zalogowany, wysyłam jego nazwę użytkownika, link do jego profilu i link do wylogowania. Jeśli nie są zalogowani, generuję standardowy link logowania. Ponadto na samej stronie niektóre treści nie są wyświetlane nieuwierzytelnionym użytkownikom, podczas gdy inne treści zależą od tego, który użytkownik jest zalogowany.

Po raz pierwszy spróbowałem rozwiązać ten problem jakiś czas temu, prosząc zespół Stack Overflow, jak rozwiązali ten problem. problem. Jeff odpowiedział, że w zasadzie nie buforują w ogóle dla nieuwierzytelnionych użytkowników. Napisałem więc atrybut wywodzący się z OutputCacheAttribute, ale anuluje buforowanie, jeśli użytkownik jest zalogowany.

Obecnie używam tego atrybutu, ale w niektórych przypadkach otrzymuję niepoprawne wyniki: Nieprawidłowe wyniki:. Na przykład użytkownik może odwiedzić stronę, a następnie zalogować się, a następnie ponownie odwiedzić tę stronę, aby zobaczyć link do logowania u góry, a nie nazwę użytkownika.

Oto kilka rozwiązań, które Zastanawiam:

  • Ustawianie typu HttpCacheability lub Cache-Control do private zamiast public. W ten sposób odpowiedź jest tylko buforowaną stroną klienta. Czy to rozwiąże problem? Jeśli tak, czy będzie to miało wpływ na wydajność buforowania? Zauważyłem, że Stack Overflow wydaje się jednak używać public.
  • Ustawienie parametru VaryByCache na cache inaczej dla każdego użytkownika, np. in this tutorial. Czy to pomoże, zachowując jednocześnie wydajność i skuteczność buforowania?

Z góry dziękuję!

Odpowiedz

9

W zależności od struktury aplikacji może być sensowne buforowanie danych zamiast widoków.

Ponieważ widoki są bardzo proste, a dostęp do bazy danych zajmuje zwykle większość czasu potrzebnego do renderowania strony, można uzyskać większość korzyści z buforowania wyników poprzez buforowanie modelu w kontrolerze, a wszelkie niedostępne części widoku będą pozostać niezmienionym, aby można było buforować zawartość publiczną oglądaną przez uwierzytelnionych użytkowników.

Istnieją również sposoby, aby buforowanie wyjścia działało z częściowymi widokami, ale moim zdaniem dodają one więcej komplikacji, niż jest to uzasadnione.