2012-07-25 14 views
5

Czy jest możliwa zmiana wyjściowej pamięci podręcznej w MVC na podstawie pewnych wartości w sesji? Dużo czytałem na temat używania funkcji różnicowania i nadpisywania GetVaryByCustomString w Global.asax, ale sesja nie jest dostępna w tym momencie.Wyjściowa pamięć MVC na podstawie wartości sesji

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "somekey") 
     //Want to check the session here (but it isn't available). 

    return base.GetVaryByCustomString(context, custom); 
} 

Rozumiem, że dzieje się tak, ponieważ sesja nie została utworzona później w potoku żądania.

Moim zmartwieniem jest to, że bez zmiany pamięci podręcznej na podstawie sesji użytkownika, strona (która zmienia się w zależności od tego, co użytkownik ma w sesji, ma dodatkowy HTML właściwy dla tego użytkownika itp.) Zostanie zbuforowana (ponieważ adres URL jest to samo) i obsługiwane przez nasz system równoważenia obciążenia, serwery proxy itp., a następnie podawane do innych wniosków z informacjami o sesjach innych osób na stronie!

Powód, dla którego adres URL jest taki sam, polega na tym, że użytkownik przychodzi jako "gość", wprowadza pewne informacje (POST), jest to sprawdzane i zapisywane w sesji, a następnie są one ponownie kierowane z powrotem na tę samą stronę (które powinno teraz być specyficzne dla użytkownika na podstawie danych sesji).

Sama strona powinna być przechowywana w pamięci podręcznej w normalnym trybie, ponieważ jeśli "gość" odwiedza ten sam adres URL, powinien za każdym razem wyświetlać tę samą "standardową" stronę.

Czy można w ten sposób zmieniać buforowanie?

Odpowiedz

0

Powinieneś zajrzeć do "Buforowania pączków", ale nie jest to obsługiwane przez ASP.NET MVC 3, przynajmniej nie po wyjęciu z pudełka. Na szczęście ktoś już rozwiązał ten problem, ponieważ widzisz, że ASP.NET MVC 4 będzie zawierać "Pamięć podręczna w pączku" po wyjęciu z pudełka, ale nie mogę powiedzieć, czy jest on w bieżącym RC, czy nie.

2

Jeśli chcesz spersonalizować wyjście pamięci podręcznej na użytkownika, lepiej ustawić lokalizację na OutputCacheLocation.Client jak poniżej. Więcej informacji: here

[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)] 
    public string GetName() 
    { 
     return "Hi " + User.Identity.Name; 
    } 
Powiązane problemy