Einige Browser speichern JS- und CSS-Dateien im Cache und können sie nur aktualisieren, wenn Sie sie dazu zwingen. Was ist der einfachste Weg.
Ich habe gerade diese Lösung implementiert, die zu funktionieren scheint.
Deklarieren Sie eine Versionsvariable auf Ihrer Seite
public string version { get; set; }
Rufen Sie die Versionsnummer vom Schlüssel web.config ab
version = ConfigurationManager.AppSettings["versionNumber"];
Rufen Sie auf Ihrer Aspx-Seite Javascript und Stylesheets wie folgt auf
<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />
Wenn Sie also in Ihrer web.config die Version 1.1 von 1.0 festlegen, lädt Ihr Browser die neuesten Dateien herunter, was Ihnen und Ihren Benutzern hoffentlich einige Frustrationen erspart.
Gibt es eine andere Lösung, die besser funktioniert, oder verursacht dies unvorhergesehene Probleme für eine Website?
javascript
c#
asp.net
.net
asp.net-mvc
Kiew
quelle
quelle
Antworten:
Ich habe dieses Problem gelöst, indem ich einen letzten geänderten Zeitstempel als Abfrageparameter an die Skripte angehängt habe.
Ich habe dies mit einer Erweiterungsmethode gemacht und in meinen CSHTML-Dateien verwendet. Hinweis: Diese Implementierung speichert den Zeitstempel 1 Minute lang im Cache, damit die Festplatte nicht so stark überlastet wird.
Hier ist die Erweiterungsmethode:
Und dann auf der CSHTML-Seite:
Im gerenderten HTML sieht dies folgendermaßen aus:
quelle
Ihre Lösung funktioniert. Es ist in der Tat sehr beliebt.
Sogar der Stapelüberlauf verwendet eine ähnliche Methode:
Wo
v=6184
ist wahrscheinlich die SVN-Revisionsnummer.quelle
In ASP.NET Core (MVC 6) funktioniert dies sofort über den
asp-append-version
Tag-Helfer:quelle
ASP.NET MVC übernimmt dies für Sie, wenn Sie Bundles für Ihr JS / CSS verwenden. Es wird automatisch eine Versionsnummer in Form einer GUID an Ihre Bundles angehängt und diese GUID nur aktualisiert, wenn das Bundle aktualisiert wird (auch bekannt als Änderungen an den Quelldateien).
Dies ist auch hilfreich, wenn Sie eine Menge JS / CSS-Dateien haben, da dies die Ladezeiten von Inhalten erheblich verbessern kann!
Siehe hier
quelle
Dafür gibt es in asp.net eine integrierte Möglichkeit: Bündelung . Benutze es einfach. Jede neue Version hat das eindeutige Suffix "? V = XXXXXXX". Im Debug-Modus ist die Bündelung deaktiviert, um die Einstellung make in web.config einzuschalten:
Oder fügen Sie der Methode RegisterBundles (BundleCollection-Bundles) Folgendes hinzu:
Beispielsweise:
BundleConfig.cs:
_Layout.cshtml:
quelle
Es gibt eine einfachere Antwort darauf als die Antwort der Operation in der Frage (der Ansatz ist der gleiche):
Definieren Sie den Schlüssel in der web.config:
Rufen Sie Appsettings direkt von der aspx-Seite aus auf:
quelle
Basierend auf der Antwort von Adam Tegan , geändert für die Verwendung in einer Webformularanwendung.
Im CS-Klassencode:
Im Aspx-Markup:
Und im gerenderten HTML erscheint es als
quelle
Interessanterweise weist genau diese Site Probleme mit dem Ansatz auf, den Sie im Zusammenhang mit einigen Proxy-Setups beschreiben, obwohl er ausfallsicher sein sollte.
Überprüfen Sie diese Meta Stack Overflow- Diskussion.
Vor diesem Hintergrund ist es möglicherweise sinnvoll, keinen GET-Parameter zum Aktualisieren zu verwenden, sondern den tatsächlichen Dateinamen:
Auch wenn dies mehr Arbeit ist, müssen Sie die Datei tatsächlich erstellen oder eine URL neu schreiben.
quelle
Ich wollte einen einfachen Einzeiler, um den Pfad einzigartig zu machen und den Cache zu sprengen. Das hat bei mir funktioniert:
Wenn die Datei seit dem letzten Laden auf der Seite geändert wurde, ruft der Browser die aktualisierte Datei ab.
Es generiert den
last modified
Stempel aus der.js
Datei und legt ihn dort anstelle der Version ein, auf die möglicherweise nicht einfach zugegriffen werden kann.Eine andere Möglichkeit könnte darin bestehen, die Prüfsumme der Datei abzurufen.
quelle
Hier ist ein Ansatz, der mit ASP.NET 5 / MVC 6 / vNext funktioniert .
Schritt 1: Erstellen Sie eine Klasse, um die letzte Schreibzeit der Datei zurückzugeben, ähnlich wie bei anderen Antworten in diesem Thread. Beachten Sie, dass hierfür die Abhängigkeitsinjektion von ASP.NET 5 (oder einer anderen) erforderlich ist.
Schritt 2: Registrieren Sie den Dienst, der in startup.cs injiziert werden soll :
Schritt 3: In ASP.NET 5 ist es dann möglich, den Dienst direkt in eine Layoutansicht wie _Layout.cshtml wie folgt einzufügen :
Es gibt einige Feinarbeiten, die durchgeführt werden könnten, um physische Pfade besser zu kombinieren und den Dateinamen in einem Stil zu behandeln, der der Syntax besser entspricht. Dies ist jedoch ein Ausgangspunkt. Ich hoffe, es hilft Menschen, auf ASP.NET 5 umzusteigen.
quelle
Ich habe auf meiner Aspnet MVC 4-Site eine etwas andere Technik angewendet:
_ViewStart.cshtml:
Dann in den aktuellen Ansichten:
quelle
<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>
Dies funktioniert bei mir in allen Browsern. Hier habe ich PHP verwendet, um zufällige Nr. Zu generieren. Sie können Ihre eigene serverseitige Sprache verwenden. "
quelle
Ausgehend von der obigen Antwort habe ich den Code ein wenig geändert, damit der Helfer auch mit CSS-Dateien funktioniert, und jedes Mal eine Version hinzugefügt, wenn Sie Änderungen an den Dateien vornehmen und nicht nur, wenn Sie den Build ausführen
quelle
Holen Sie sich die Änderungszeit der Datei, wie unten gezeigt
Fügen Sie dies mit der Eingabe als Querystring hinzu
Nennen Sie dies vom Markup.
MVC Extension Helper Approach
Fügen Sie eine Erweiterungsmethode hinzu
Fügen Sie diesen Namespace in web.config hinzu
Verwenden Sie es in Ansicht als
quelle
Vereinfachte vorherige Vorschläge und Bereitstellung von Code für .NET Web Forms-Entwickler.
Dies akzeptiert sowohl relative ("~ /") als auch absolute URLs im Dateipfad zur Ressource.
Fügen Sie eine statische Erweiterungsklassendatei wie folgt ein:
Und nennen Sie es dann auf Ihrer Masterseite als solche:
quelle
Basierend auf der obigen Antwort habe ich eine kleine Erweiterungsklasse geschrieben, um mit CSS- und JS-Dateien zu arbeiten:
Anstatt etwas zu schreiben wie:
Sie können jetzt schreiben:
Dh einfach ersetzen
Url.Content
mitUrl.VersionedContent
.Generierte URLs sehen ungefähr so aus:
Wenn Sie die Erweiterungsklasse verwenden, möchten Sie möglicherweise eine Fehlerbehandlung hinzufügen, falls der
MapPath
Aufruf nicht funktioniert, dacontentPath
es sich nicht um eine physische Datei handelt.quelle
Ich verwende eine ähnliche Methode, um dasselbe zu tun, ohne jede Seite zu ändern. Ein PreRender-Ereignis wurde als Master-Datei hinzugefügt. Es hält meine Logik an einem Ort und gilt sowohl für JS- als auch für CSS-Dateien.
quelle
Sie können die DefaultTagFormat-Eigenschaft von Skripten oder Stilen überschreiben.
quelle
Um dieses Problem in meiner ASP.Net Ajax-Anwendung zu beheben, habe ich eine Erweiterung erstellt und dann die Masterseite aufgerufen.
Für weitere Details können Sie über den Link gehen .
quelle
Einfache und intelligente Möglichkeit, die CSS-Versionierung in der .net-Anwendung mithilfe des folgenden Konzepts zu implementieren. Sie müssen keinen Back-End-Code schreiben.
quelle
Das Hauptproblem dabei ist hauptsächlich, dass Sie daran denken müssen, Ihre Versionsnummer in Ihrem Code jedes Mal zu aktualisieren, wenn Sie Änderungen an Ihren CSS- oder JS-Dateien vornehmen.
Ein möglicherweise besserer Weg, dies zu tun, besteht darin, für jede Ihrer CSS- oder JS-Dateien einen garantierten eindeutigen Parameter festzulegen, wie folgt:
Dadurch werden die Dateien jedes Mal vom Server angefordert. Dies bedeutet auch, dass Ihre Site beim Laden der Seite nicht so leistungsfähig ist, da diese Dateien niemals zwischengespeichert werden und jedes Mal nicht benötigte Bandbreite verwenden.
Wenn Sie daran denken können, die Versionsnummer jedes Mal zu aktualisieren, wenn eine Änderung vorgenommen wird, können Sie im Wesentlichen davon profitieren, wie Sie dies tun.
quelle
Für ASP.NET-Seiten verwende ich Folgendes
VOR
AFTER (Nachladen erzwingen)
Das Hinzufügen von DateTime.Now.Ticks funktioniert sehr gut.
quelle