In diesem Tipp geht es um das Caching von Silverlight XAP-Dateien durch den Browser oder einen Proxy-Server.
Zusammenfassung
Manchmal werden XAP-Dateien zu lange zwischengespeichert und der Anwender arbeitet mit einer älteren Version der Silverlight Anwendung, obwohl auf dem Server bereits eine neuere XAP-Datei vorliegt. Man kann dies verhindern, indem man an die URL der XAP-Datei einen kurzen Parameter anfügt, dessen Wert vom letzten Änderungsdatum der XAP-Datei abhängt.
Beschreibung
Normalerweise braucht man sich über das Caching der XAP-Dateien, in denen sich die gesamte Silverlight Anwendung befindet, keine Gedanken machen. Wenn jedoch beispielsweise ein Kunde in seinem Intranet einen ISA Server als Proxy verwendet, kann es passieren, dass der Kunde die vom Entwickler gerade frisch auf dem Server aktualisierte Silverlight Anwendung nicht verwenden kann, weil ihm sein Proxy-Server die zwischengespeicherte Vorgängerversion der XAP-Datei liefert.
Neu laden der Webseite im Browser bringt da leider gar nichts. Und das Unterdrücken des Cachings der Webseite, in der die Silverlight Anwendung eingebettet ist, hat natürlich auch keinen Erfolg, denn das Problem liegt im Caching der XAP-Datei auf dem Proxy-Server. Aus der Sicht eines Browsers oder Proxy- Servers ist eine XAP-Datei auch nur eine binäre Ressource wie beispielsweise eine PNG- oder JPEPDatei. Daher wird sie genauso zwischengespeichert.
Im HTML-Element <object>, welches die Silverlight Anwendung beschreibt, gibt es einen Parameter, der die URL der XAP-Datei festlegt. Dieser sieht beispielsweise so aus:
<param name="source" value="ClientBin/MySilverlightApplication.xap"/>
Eine mögliche Lösung wäre die aktuelle Versionsnummer in den Dateinamen aufzunehmen:
<param name="source" value="ClientBin/MySilverlightApplication-1.2.3.xap"/>
Dies führt zu einer Aktualisierung des Caches, wenn eine neue Version eingespielt wird, da sich dabei die URL ändert. Es kann jedoch zu neuen Problemen kommen, wenn beispielsweise das <param> Element auf der Webseite nicht zum Namen der XAP-Datei auf dem Server passt.
Es ist daher besser, die Versionsnummer als Dummy-Parameter an die URL anzufügen und den eigentlichen Namen der XAP-Datei unverändert zu lassen:
<param name="source" value="ClientBin/MySilverlightApplication.xap?v=1.2.3"/>
Die Silverlight Runtime interessiert der Text rechts vom Fragezeichen nicht. Und bei einer neue Versionsnummer ändert sich dennoch die URL, sodass der Proxy-Server die XAP-Datei neu vom Web-Server anfordert.
Der Nachteil liegt allerdings darin, dass die Versionsnummer serverseitig immer irgendwie bestimmt werden muss. Daher ist es einfacher, statt der Versionsnummer das letzte Schreibdatum der XAP-Datei als Parameter zu verwenden:
<param name="source" value="ClientBin/MySilverlightApplication.xap?x=2010-08-15_16:17:18"/>
Dieser Wert lässt sich serverseitig mit File.GetLastWriteTime praktisch ohne Overhead ermitteln. Wenn man nicht möchte, dass jeder dieses Datum sieht, kann man es beispielsweise auch einfach in eine Zahl umrechnen. Jetzt muss man nur noch das Caching der Webseite selbst verhindern:
<meta http-equiv="expires" content="0">
Damit haben wir erreicht, dass der Proxy-Server die XAP-Datei zwischenspeichert, solange sie sich nicht ändert, und neu anfordert, sobald sie auf dem Server ausgetauscht wurde.
Diese Methode funktioniert gut mit dem Internet Explorer und dem Firefox in Zusammenhang mit dem ISA Server. Andere Browser haben wir nicht ausreichend getestet. Bei anderen Browsern könnte es beispielsweise sein, dass das Fragezeichen in der URL das Caching im Browser verhindert und die XAPDatei jetzt jedes Mal neu angefordert wird.
Hier geht's zum nächsten Tipp.