Niektóre przeglądarki buforują pliki js i css, nie mogą ich odświeżyć, chyba że zostanie to narzucone. Jaki jest najłatwiejszy sposób.
Właśnie wdrożyłem to rozwiązanie, które wydaje się działać.
Zadeklaruj zmienną wersji na swojej stronie
public string version { get; set; }
Uzyskaj numer wersji z klucza web.config
version = ConfigurationManager.AppSettings["versionNumber"];
Na stronie aspx wykonaj wywołania javascript i arkuszy stylów w ten sposób
<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />
Jeśli więc ustawisz wersję 1.1 z 1.0 w swoim web.config, Twoja przeglądarka pobierze najnowsze pliki, co, miejmy nadzieję, zaoszczędzi Tobie i Twoim użytkownikom pewnej frustracji.
Czy istnieje inne rozwiązanie, które działa lepiej, czy też spowoduje to nieprzewidziane problemy na stronie internetowej?
javascript
c#
asp.net
.net
asp.net-mvc
Kijów
źródło
źródło
Odpowiedzi:
Rozwiązałem to, dołączając ostatnio zmodyfikowany znacznik czasu jako parametr zapytania do skryptów.
Zrobiłem to za pomocą metody rozszerzenia i używając jej w moich plikach CSHTML. Uwaga: ta implementacja buforuje znacznik czasu przez 1 minutę, więc nie wyrzucamy zbyt mocno dysku.
Oto metoda rozszerzenia:
A potem na stronie CSHTML:
W wyrenderowanym kodzie HTML wygląda to tak:
źródło
Twoje rozwiązanie działa. W rzeczywistości jest dość popularny.
Even Stack Overflow używa podobnej metody:
Gdzie
v=6184
jest prawdopodobnie numer wersji SVN.źródło
W ASP.NET Core (MVC 6) działa to po wyjęciu z pudełka za pośrednictwem
asp-append-version
pomocnika tagów: In ASP.NET Core (MVC 6) this works out of the box via the tag helper:źródło
ASP.NET MVC poradzi sobie z tym za Ciebie, jeśli używasz pakietów dla swojego JS / CSS. Automatycznie doda numer wersji w postaci identyfikatora GUID do twoich pakietów i zaktualizuje ten identyfikator GUID tylko wtedy, gdy pakiet zostanie zaktualizowany (inaczej każdy z plików źródłowych ma zmiany).
Pomaga to również, jeśli masz mnóstwo plików JS / CSS, ponieważ może znacznie poprawić czas ładowania treści!
Spójrz tutaj
źródło
W asp.net istnieje wbudowany sposób: sprzedaż wiązana . Po prostu go użyj. Każda nowa wersja będzie miała unikalny sufiks „? V = XXXXXXX”. W trybie debugowania pakietowanie jest wyłączone, aby włączyć ustawienia w web.config:
Lub dodaj do metody RegisterBundles (pakiety BundleCollection):
Na przykład:
BundleConfig.cs:
_Layout.cshtml:
źródło
Jest na to prostsza odpowiedź niż odpowiedź udzielona przez op w pytaniu (podejście jest takie samo):
Zdefiniuj klucz w pliku web.config:
Wykonaj wywołanie appSettings bezpośrednio ze strony aspx:
źródło
Na podstawie odpowiedzi Adama Tegana , zmodyfikowanej do użytku w aplikacji formularzy internetowych.
W kodzie klasy .cs:
W znaczniku aspx:
A w wyrenderowanym kodzie HTML wygląda jak
źródło
Co ciekawe, ta sama witryna ma problemy z podejściem, które opisujesz w związku z niektórymi konfiguracjami proxy, mimo że powinno być bezpieczne.
Sprawdź tę dyskusję dotyczącą przepełnienia Meta Stack .
W związku z tym rozsądne może być nie używanie parametru GET do aktualizacji, ale rzeczywista nazwa pliku:
nawet jeśli jest to więcej pracy do wykonania, ponieważ będziesz musiał faktycznie utworzyć plik lub napisać dla niego przepisany adres URL.
źródło
Chciałem prostego, jednego linera, aby ścieżka była unikalna, aby zniszczyć pamięć podręczną. To zadziałało dla mnie:
Jeśli plik został zmodyfikowany od czasu ostatniego załadowania go na stronę, przeglądarka pobierze zaktualizowany plik.
Generuje
last modified
stempel z.js
pliku i wsuwa go tam zamiast wersji, do której dostęp może nie być łatwy.Inną opcją może być pobranie sumy kontrolnej pliku.
źródło
Oto podejście, które działa z ASP.NET 5 / MVC 6 / vNext .
Krok 1: Utwórz klasę, która będzie zwracać czas ostatniego zapisu pliku, podobnie jak w przypadku innych odpowiedzi w tym wątku. Uwaga: wymaga to iniekcji zależności ASP.NET 5 (lub innej).
Krok 2: Zarejestruj usługę, która ma zostać wstrzyknięta w startup.cs :
Krok 3: Następnie w ASP.NET 5 można wstrzyknąć usługę bezpośrednio do widoku układu, takiego jak _Layout.cshtml w następujący sposób:
Istnieje kilka ostatnich poprawek, które można zrobić, aby lepiej połączyć ścieżki fizyczne i obsłużyć nazwę pliku w stylu bardziej zgodnym ze składnią, ale to jest punkt wyjścia. Mam nadzieję, że pomoże to ludziom przejść na ASP.NET 5.
źródło
W mojej witrynie ASPNET MVC 4 zastosowałem nieco inną technikę:
_ViewStart.cshtml:
Następnie w rzeczywistych widokach:
źródło
<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>
Działa to dla mnie we wszystkich przeglądarkach. Tutaj użyłem PHP do wygenerowania losowego nie. Możesz użyć własnego języka po stronie serwera .`
źródło
Zaczynając od powyższej odpowiedzi zmodyfikowałem trochę kod, aby pomocnik działał również z plikami CSS i dodawałem wersję za każdym razem, gdy robisz jakąś zmianę w plikach, a nie tylko podczas budowania
źródło
Uzyskaj czas modyfikacji pliku, jak pokazano poniżej
Dołącz to z wejściem jako querystring
Nazwij to ze znaczników.
Podejście pomocnika rozszerzenia MVC
Dodaj metodę rozszerzenia
Dodaj tę przestrzeń nazw w web.config
Użyj go w widoku jako
źródło
Uproszczone wcześniejsze sugestie i udostępnienie kodu dla programistów .NET Web Forms.
Spowoduje to zaakceptowanie względnych („~ /”) i bezwzględnych adresów URL w ścieżce pliku do zasobu.
Umieść w statycznym pliku klasy rozszerzeń, następujący:
A potem nazwij to na swojej stronie wzorcowej tak:
źródło
Na podstawie powyższej odpowiedzi napisałem małą klasę rozszerzenia do pracy z plikami CSS i JS:
Zamiast pisać coś takiego:
Możesz teraz napisać:
Czyli po prostu wymienić
Url.Content
sięUrl.VersionedContent
.Wygenerowane adresy URL wyglądają mniej więcej tak:
Jeśli używasz klasy rozszerzenia, możesz dodać obsługę błędów w przypadku, gdy
MapPath
połączenie nie działa, ponieważcontentPath
nie jest to plik fizyczny.źródło
Używam podobnego sposobu, aby zrobić to samo, co robisz, bez modyfikowania każdej strony. Dodano zdarzenie PreRender to plik główny. Utrzymuje moją logikę w jednym miejscu i ma zastosowanie zarówno do plików js, jak i css.
źródło
Możesz przesłonić właściwość DefaultTagFormat skryptów lub stylów.
źródło
Aby rozwiązać ten problem w mojej aplikacji ASP.Net Ajax, utworzyłem rozszerzenie, a następnie wywołałem na stronie wzorcowej.
Aby uzyskać więcej informacji, możesz przejść przez link .
źródło
Łatwy i sprytny sposób na implementację wersji css w aplikacji .net według poniższej koncepcji. Nie ma potrzeby pisania kodu zaplecza.
źródło
Główny problem z robieniem tego w ten sposób polega głównie na tym, że będziesz musiał pamiętać o aktualizowaniu numeru wersji w kodzie za każdym razem, gdy wprowadzasz jakiekolwiek zmiany w plikach css lub js.
Prawdopodobnie lepszym sposobem na to jest ustawienie gwarantowanego unikalnego parametru dla każdego pliku css lub js, na przykład:
Wymusza to za każdym razem żądanie plików z serwera, co oznacza również, że Twoja witryna nie będzie tak wydajna po załadowaniu strony, ponieważ te pliki nigdy nie będą buforowane i za każdym razem będą wykorzystywać niepotrzebną przepustowość.
Zasadniczo, jeśli pamiętasz o aktualizowaniu numeru wersji za każdym razem, gdy wprowadzana jest zmiana, możesz uciec od tego, jak to robisz.
źródło
W przypadku stron ASP.NET używam następujących plików
PRZED
PO (wymuszenie przeładowania)
Dodanie DateTime.Now.Ticks działa bardzo dobrze.
źródło