2010-06-07 19 views
11

Nie jestem pewien, czy jest to problem z serwerem, czy też nie rozumiem, jak naprawdę działa buforowanie HTTP.Błąd buforowania HTTP

Mam aplikację ASP MVC działającą na IIS7. W witrynie znajduje się wiele statycznych treści, w tym wiele plików CSS, JavaScript i plików graficznych.

Dla tych plików chcę przeglądarka buforować je na co najmniej jeden dzień - nasze .css, .js, .gif i plików .png rzadko zmieniają.

Moje web.config idzie tak:

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

Problem Dostaję to, że przeglądarka (testowane Chrome, IE8 i FX) nie wydają się być buforowanie plików jak ja oczekiwać. Mam ustawienia domyślne (automatycznie sprawdzaj nowsze strony w IE).

Na pierwszej wizycie Content pliki do pobrania jako oczekiwane

HTTP/1.1 200 OK 
Cache-Control: max-age=86400 
Content-Type: image/gif 
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT 
Accept-Ranges: bytes 
ETag: "3efeb2294517ca1:0" 
Server: Microsoft-IIS/7.0 
X-Powered-By: ASP.NET 
Date: Mon, 07 Jun 2010 14:29:16 GMT 
Content-Length: 918 

<content> 

myślę że Cache-Control: max-age=86400 powinien poinformować przeglądarkę, by nie żądać ponownie stronę na jeden dzień.

Ok, więc teraz strona jest przeładowana, a przeglądarka żąda obraz ponownie. Tym razem robi się pusty odpowiedź z tych nagłówków:

HTTP/1.1 304 Not Modified 
Cache-Control: max-age=86400 
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT 
Accept-Ranges: bytes 
ETag: "3efeb2294517ca1:0" 
Server: Microsoft-IIS/7.0 
X-Powered-By: ASP.NET 
Date: Mon, 07 Jun 2010 14:30:32 GMT 

Wygląda więc na to przeglądarka wysłał ETag back (jako unikalny identyfikator zasobu) i wrócić serwera z 304 Not Modified - informowanie przeglądarki, że może użyć pobranego wcześniej pliku.

Wydaje mi się, że byłoby poprawne dla wielu sytuacjach buforowania, ale tutaj nie chcę dodatkowego obie strony. Nie obchodzi mnie, czy obraz staje się nieaktualny, gdy zmienia się plik na serwerze.

Istnieje wiele z tych plików (nawet sprite-map i tym podobne), a wielu z naszych klientów ma bardzo powolnych sieci. Każda podróż w obie strony do pingowania dla tego statusu zajmuje około 10 do 5 sekundy. Wiele z nich ma również IE6, który ma tylko 2 połączenia HTTP naraz. Rezultatem jest to, że nasza aplikacja wydaje się bardzo powolna dla tych klientów, przy czym każda strona zajmuje dodatkowe kilka sekund, aby sprawdzić, czy statyczna zawartość się nie zmieniła.

nagłówek

Co odpowiedź mi brakuje, że spowodowałoby przeglądarkę agresywnie buforować pliki?

Jak ustawić to w .Net web.config dla IIS7?

Czy nie rozumiem, jak działa buforowanie HTTP?

+0

można wyłączyć ETag? To cię może naprawić, ale nie jestem pewien. –

+0

Mam zamiar spróbować usunąć ETag, ale dla mojego serwera testowego wygląda na to, że pasuje do niego – Keith

+6

Po naciśnięciu klawisza odświeżania lub F5 przeglądarka zawsze wykona żądanie serwera (prawdopodobnie żądanie warunkowe) niezależnie od ustawień pamięci podręcznej –

Odpowiedz

5

stosowanie wygasa nagłówek zamiast używania pamięci podręcznej control.Tell serwer po raz pierwszy, że mi służyć zawartość z mojego pamięci podręcznej przeglądarki aż do wygaśnięcia. Nie będzie sprawdzania krzyżowego pod kątem zmian w pliku do daty wygaśnięcia.

dodać nagłówek w sekcji system.webServer Twojej web.config jest tak:

<system.webServer> 
    <staticContent> 
     <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" 
        cacheControlMode="UseExpires" />; 
    </staticContent> 
</system.webServer> 
+0

Jak to zrobić w IIS7? Ponadto - dlaczego działa to, gdy 'cache-control' nie działa? – Keith

+0

Dziękuję za wyjaśnienia - czy złamano 'cache-control'? – Keith

+0

Nie wierzę w to, że coś, czego ty i ja brakuje, czytam więcej na temat kontroli pamięci podręcznej w tym momencie, powiadomię cię, jeśli zrozumiem. Tak, ale moja sugestia działała dla ciebie –

6

Musisz użyć Wygasa dyrektywę, w przeciwnym razie przeglądarka będzie zawsze sprawdzić, czy zawartość została zaktualizowana.

Jeśli wpis z pamięci podręcznej ma prawidłową datę wygaśnięcia, przeglądarka może ponownie wykorzystać zawartość bez konieczności kontaktowania się z serwerem, gdy strona lub witryna jest ponownie odwiedzana. Znacznie zmniejsza to liczbę tras w sieci dla często odwiedzanych stron. Na przykład logo Google wygaśnie w 2038 r. I zostanie pobrane tylko przy pierwszej wizycie na stronie google.com lub po opróżnieniu pamięci podręcznej przeglądarki. Jeśli kiedykolwiek będą chcieli zmienić obraz, mogą użyć innej nazwy pliku obrazu lub ścieżki.

Aby zmienić w IIS7, użyj następującego. Jest to najłatwiejsze do zarządzania, jeśli zachowasz statyczną zawartość w określonych katalogach.

Zaloguj się na serwerze
Otwórz Menedżera usług IIS (start -> Narzędzia adminstrative -> Menedżer usług IIS
Rozwiń węzeł serwera
Rozwiń węzeł witryn
otworzyć witrynę i przejdź do katalogu, który chcesz zmienić
Otwórz sekcję IIS Nagłówki HTTP Response
Kliknij Ustaw Wspólne Główki w okienku zadań po prawej
Ustaw „wygasa Web Content”, jak wymaga aplikacja.

+1

Dzięki - twoje kroki w IIS7 będą faktycznie produkować ten sam plik web.config XML, który jest jednak w moim pytaniu. – Keith

-1

Krótki anwser: usuń Etag i użyj nagłówka Expire.

Należy zapoznać się z 35 Yahoo Performance best practices, a dokładniej:

Dla każdej reguły, zazwyczaj pokrycie Konfiguracja serwera WWW Apache i IIS.

Edit: Ok, wygląda na to, że nie jest prosty sposób, aby usunąć Etags w IIS, besides installing some 3rd party software ...

+0

Niestety nie wydaje się możliwe usunięcie ETags na IIS7 - patrz http://stackoverflow.com/questions/477913 – Keith

+0

Dlaczego nagłówek 'expire' działa, gdy' cache-control' nie działa? Nie musimy obsługiwać IE5, a wszystko, co jest w przeszłości, obsługuje HTTP 1.1 – Keith

+0

Dzięki za odpowiedź (+1).'Expires' i' Cache-Control' działają równie dobrze (chyba, że ​​jesteś na IE5 lub niższym, a następnie tylko 'Expires'), dopóki jest ustawione, jesteś dobry. Okazuje się, że moim rzeczywistym problemem było to, że wybrałem F5/refresh w celu sprawdzenia, co zawsze powoduje, że przeglądarka pinguje każdy plik i otrzymuje odpowiedzi _304 Not Modified_. – Keith