2010-01-20 19 views
25

Chciałbym mieć obrazy, css i javascript buforowane po stronie klienta w przeglądarce podczas ładowania strony internetowej. Jest tak wiele różnych typów buforowania, że ​​jestem zdezorientowany, które z nich używać z asp.net mvc.jak cache css, obrazy i js?

Czy byłoby również możliwe, aby ich przeglądarki sprawdzały nowe lub zmodyfikowane wersje tych plików?

Dzięki!

Odpowiedz

6

Przeglądarki automatycznie zajmują się tym za Ciebie. Musisz zejść mi z drogi, aby NIE buforować css, js, html i obrazów.

nie jestem zaznajomiony z ASP MVC, ale myślę, że rodzaj buforowanie myślisz jest opcode buforowanie wyjścia dla utworzonego dynamiczne po stronie serwera?

+0

Rzeczy nie są takie proste. Buforowanie jest ważne, jeśli zależy Ci na pozbawionej błędów i dobrze działającej stronie. Chcesz, aby użytkownicy nie musieli ponownie pobierać treści, ale chcesz też uniknąć odwiedzania nieaktualnych treści. W ASP.NET MVC używam podejścia, które zawiera skrót mieszania MD5 w adresie URL, który osiąga to bez zbytniego myślenia po jego skonfigurowaniu. Sprawdź [tutaj moja odpowiedź] (http://stackoverflow.com/questions/936626/how-can-i-force-a-hard-refresh-ctrlf5/6439351#6439351) dla kodu źródłowego. –

+0

@ Drew Sure, nie był to plan przeglądania pamięci podręcznej. Po prostu mówię pytającemu, że jeśli nie potrzebujesz dokładniejszego sterowania, istniejące domyślne ustawienia w przeglądarkach i serwerach nie są takie złe. Apache jest zwykle skonfigurowany do obsługi ETagów itp., A przeglądarki zwykle współpracują z 304-tymi. Sprawdziłeś swoje rozwiązanie i to jest dobry pomysł! Prawdopodobnie skorzystam z tego pomysłu w Django. – JAL

-2

Buforowanie po stronie klienta jest obsługiwane automatycznie przez przeglądarki po ustawieniu properly setCache-Control headers i ustawieniu web.config. W ten sposób:

<system.webServer> 
    <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00.00:10:00" /> 
    </staticContent> 
</system.webServer> 
+3

To naprawdę nie jest takie proste. Musisz podać odpowiednie nagłówki w odpowiedzi HTTP. Ponadto musisz poinformować przeglądarki, aby w jakiś sposób unieważniały pamięć podręczną, gdy zmieni się zawartość, w przeciwnym razie witryna nie powiedzie się, dopóki nie wykona twardego odświeżenia. –

43

Musisz ustawić nagłówki kontroli pamięci podręcznej na serwerze. Można to zrobić poprzez trzymanie tego w pliku web.config:

<system.webServer> 
    <staticContent> 
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" /> 
    </staticContent> 
</system.webServer> 

by to powiedzieć przeglądarkę teraz nawet sprawdzić nowe treści na coś statycznego przez 30 dni.

Aby uzyskać drugie pytanie, należy podać mechanizm dodawania kwerendy do treści. W moim obecnym projekcie kompresujemy i łączymy oraz javascript i css jako część kompilacji. Kiedy umieszczenie linków na stronie wygląda następująco:

<script src="/Resources/Javascript/Combined.js?v=2.2.0.1901" type="text/javascript"></script> 

ciągu kwerendy jest liczba Major.Minor.0.Changeset i zmiany w dowolnym czasie możemy nacisnąć build, powodując klienta, aby ponownie pobrać go. To samo dzieje się na arkuszach stylów w ich elementach <link>.

+0

Czy ten bufor klienta będzie również buforował HTML? Chciałbym przyspieszyć obszary mojego konta, które intensywnie wykorzystują ajax, buforując tylko skrypty, css i obrazy (nie html). Co poleciłbyś do tego? – chobo

+0

@obobo: To wpłynęłoby tylko na zawartość statyczną ... to jest kierunek do IIS 7, jak radzić sobie z rzeczami, których ASP.Net nie obsługuje (obrazy, css, js). Wszystko dynamiczne jak aspx ** NIE ** pobiera tego nagłówka i nie będzie buforowane. –

+0

Używanie ciągów kwerend dla wersji oznacza, że ​​niektóre serwery proxy nie buforują pliku. Lepiej umieścić go bezpośrednio w adresie URL. A jeśli masz zamiar to zrobić, użyj skrótu MD5 zawartości pliku i zamień koncepcję wersjonowania na koncepcję tożsamości. Mam niektóre [tutaj kod źródłowy] (http://stackoverflow.com/questions/936626/how-can-i-force-a-hard-refresh-ctrlf5/6439351#6439351), który pokazuje, jak to zrobić w tej chwili . Doceniam myśli i opinie. –

4

@Paul Creasey i @Salsa są zarówno poprawne, że przeglądarka będzie obsługiwać buforowanie domyślnie tak długo, jak link jest taka sama.

Jak wspomniano, to stwarza problem, kiedy trzeba aktualizować te pliki jak nie masz gwarancji, że przeglądarka klienta sprawdzi zaktualizowanej wersji. W wielu przypadkach robią to tylko po upływie ustalonego czasu, co może doprowadzić do oszałamiającego doświadczenia użytkownika.

Na tej stronie jest już zadanych kilka pytań dotyczących obsługi alertowania przeglądarek klientów pod numerem refresh the cache. Krótko mówiąc, wszystkie one polegają na zmianie łącza podczas zmiany zawartości pliku.

można dodać parametr do adresu URL, który będzie używany tylko do celów buforowania, takie jak:

<script src="/myJavascript.js?version=4"></script> 

Następnie wystarczy zmienić numer wersji po zmianie zawartości i trzeba wymusić bocznej klient ala odświeżania this answer.

0

Najlepiej to zrobić w IIS lub w pliku konfiguracyjnym - upewnij się, że CSS/JS/images są ustawione, aby nigdy nie wygaśnie.

Kiedy można odwołać je z kodem, proponuję dołączenie wersji lub wbudowany datę do nazwy pliku, na przykład script.js?20100120, więc gdy podejmiesz próbę ich zmiany, wystarczy zmienić wersję, aby wymusić odświeżenie wszystkich przeglądarek, które ją zapisały.

1

Spójrz na answer I posted here rozwiązania, które maksymalizuje korzyści wynikające z zastosowania buforowania i unika jakichkolwiek problemów z wymagających użytkowników „twarde” odświeżania (Ctrl + F5).

Używa skrótu MD5 samej treści w adresie URL, dzięki czemu adres URL pozostaje taki sam, o ile plik jest taki sam, co jest naprawdę celem. Obliczanie skrótu jest superszybkie i jest buforowane w pamięci na serwerze, dzięki czemu renderowanie strony nie jest zauważalnie spowolnione. Cała sprawa jest mierzona w mikrosekundach, a korzyści zostały (na my site for scuba divers) niesamowite jak dotąd. Stosuję go do wszystkich obrazów, CSS i JS, z wyjątkiem obrazów z plików CSS, ponieważ nie są one generowane przez serwer w mojej witrynie (jeszcze).

Powiązane problemy