Mam aplikację ASP.NET MVC 3. Ta aplikacja żąda rekordów za pośrednictwem jQuery. jQuery odwołuje się do akcji kontrolera, która zwraca wyniki w formacie JSON. Nie udało mi się tego udowodnić, ale obawiam się, że moje dane mogą być buforowane.
Chcę tylko, aby buforowanie dotyczyło określonych akcji, a nie wszystkich akcji.
Czy istnieje atrybut, który mogę zastosować w celu zapewnienia, że dane nie zostaną buforowane? Jeśli nie, to jak mogę zapewnić, że przeglądarka za każdym razem otrzymuje nowy zestaw rekordów zamiast zestawu buforowanego?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
JavaScript Developer
źródło
źródło
Odpowiedzi:
Aby upewnić się, że JQuery nie buforuje wyników, w metodach ajax wstaw następujące:
Lub, aby zapobiec buforowaniu w MVC, stworzyliśmy własny atrybut, możesz zrobić to samo. Oto nasz kod:
Następnie po prostu udekoruj swój kontroler
[NoCache]
. LUB aby to zrobić, wystarczy umieścić atrybut na klasie klasy podstawowej, z której dziedziczysz kontrolery (jeśli masz taką), tak jak my tutaj:Możesz również ozdobić niektóre akcje tym atrybutem, jeśli chcesz, aby nie były one buforowane, zamiast dekorować cały kontroler.
Jeśli twoja klasa lub akcja nie miała,
NoCache
kiedy była renderowana w przeglądarce i chcesz sprawdzić, czy działa, pamiętaj, że po skompilowaniu zmian musisz wykonać „twarde odświeżenie” (Ctrl + F5) w przeglądarce. Do tego czasu przeglądarka zachowa starą wersję z pamięci podręcznej i nie odświeży jej za pomocą „normalnego odświeżenia” (F5).źródło
Możesz użyć wbudowanego atrybutu pamięci podręcznej, aby zapobiec buforowaniu.
W przypadku .NET Framework:
[OutputCache(NoStore = true, Duration = 0)]
W przypadku .net Core:
[ResponseCache(NoStore = true, Duration = 0)]
Pamiętaj, że nie można zmusić przeglądarki do wyłączenia buforowania. Najlepsze, co możesz zrobić, to zaproponować sugestie, które większość przeglądarek uzna, zwykle w postaci nagłówków lub metatagów. Ten atrybut dekoratora wyłączy buforowanie serwera, a także doda ten nagłówek:
Cache-Control: public, no-store, max-age=0
. Nie dodaje metatagów. W razie potrzeby można je dodać ręcznie w widoku.Ponadto JQuery i inne frameworki klienckie spróbują oszukać przeglądarkę, aby nie korzystała z buforowanej wersji zasobu, dodając elementy do adresu URL, takie jak sygnatura czasowa lub identyfikator GUID. Skutecznie powoduje to, że przeglądarka ponownie prosi o zasób, ale tak naprawdę nie zapobiega buforowaniu.
Na ostatnią notatkę. Należy pamiętać, że zasoby można również buforować między serwerem a klientem. Dostawcy usług internetowych, serwery proxy i inne urządzenia sieciowe również buforują zasoby i często używają wewnętrznych reguł bez patrzenia na rzeczywisty zasób. Niewiele można z tym zrobić. Dobrą wiadomością jest to, że zwykle buforują one w krótszych ramach czasowych, takich jak sekundy lub minuty.
źródło
Cache-Control:public, no-store, max-age=0
. Nie dodaje metatagów. W razie potrzeby można je dodać ręcznie w widoku.NoStore = true
iDuration = 0
(z którego z powodzeniem korzystałem, dzięki), ale jaki dodatkowy efekt by to zrobiłVaryByParam = "None"
, ponieważ pozostałe dwie opcje wpływają na wszystkie żądania niezależnie od parametru?Wszystko czego potrzebujesz to:
lub, jeśli chcesz go wyłączyć dla całego kontrolera:
Pomimo debaty w komentarzach tutaj wystarczy to wyłączyć buforowanie przeglądarki - powoduje to, że ASP.Net emituje nagłówki odpowiedzi, które informują przeglądarkę, że dokument wygasa natychmiast:
źródło
Cache-Control
dopublic
max-age=0
nigdy nie oznacza „wyłączonej pamięci podręcznej”. To znaczy tylko, że treść odpowiedzi należy uznać natychmiast nieświeże , ale pamięć podręczna może ją buforować. Przeglądarki powinny zweryfikować świeżość przestarzałej zawartości w pamięci podręcznej przed jej użyciem, ale nie jest to obowiązkowe, chyba że określono dodatkową dyrektywęmust-revalidate
.W akcji kontrolera dołącz do nagłówka następujące wiersze
źródło
Oto
NoCache
atrybut zaproponowany przez mattytommo, uproszczony dzięki wykorzystaniu informacji z odpowiedzi Chrisa Moschiniego:źródło
max-age=0
nigdy nie oznacza „wyłączonej pamięci podręcznej”. To znaczy tylko, że treść odpowiedzi należy uznać natychmiast nieświeże , ale pamięć podręczna może ją buforować. Przeglądarki powinny zweryfikować świeżość przestarzałej zawartości w pamięci podręcznej przed jej użyciem, ale nie jest to obowiązkowe, chyba że określono dodatkową dyrektywęmust-revalidate
.no-cache
, która nadal pozwala na buforowanie, ale upoważnia do ponownej walidacji na serwerze pochodzenia przed użyciem. Aby uniknąć nawet ponownego sprawdzania buforowania, musisz dodaćno-store
wraz zno-cache
. (no-store
samo jest po prostu błędne, ponieważ lotne pamięci podręczne mogą buforować zawartość oznaczoną jakono-store
.)Dla MVC6 ( DNX ) nie ma
System.Web.OutputCacheAttribute
Uwaga: ustawienie
NoStore
parametru Czas trwania nie jest brane pod uwagę. Możliwe jest ustawienie początkowego czasu trwania pierwszej rejestracji i zastąpienie go niestandardowymi atrybutami.Ale my mamy
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
Możliwe jest zastąpienie początkowego filtru niestandardowym atrybutem
Oto przypadek użycia
źródło
Buforowanie danych wyjściowych w MVC
źródło
Prawidłowa wartość atrybutu Asp.Net MVC Core, aby zapobiec buforowaniu przeglądarki (w tym Internet Explorer 11 ) to:
zgodnie z opisem w dokumentacji Microsoft:
Buforowanie odpowiedzi w programie ASP.NET Core - NoStore i Location.None
źródło
Rozwiązania ASP.NET MVC 5:
App_Start/FilterConfig.cs
„sRegisterGlobalFilters
metody:OutputCache
dyrektywę na poziomieController
lubView
poziomie. Dla zwykłego kontrolera to jestalbo jeśli to
ApiController
będzieźródło