Entwickler-Ecke

Programmiersprachen (Client) - [FF3,Prototype]AJAX-Caching


Martok - Do 19.03.09 20:38
Titel: [FF3,Prototype]AJAX-Caching
Hi!

Ich bastle grad mal etwas mit Ajax rum, und laufe da ständig in komische Caching-Probleme. Und zwar rufe ich (mit Prototype) per Ajax.Request eine Datei ab. Wirklich eine Datei, kein PHP- oder ähnliches Script.
Das Problem ist: wenn ich das normal mache, wird das Ding nur einmal abgerufen. Danach wird der XMLHTTPRequest direkt aus dem Cache bedient, ohne nochmal zu revalidaten und ggf auf das 304 zu warten. Ist doof, wenn sich die Datei geändert hat (ich also weiter programmiert hab^^). Ich muss also das Caching ausschalten.
Das geht auch, indem ich im Request ein "If-modified-since: $(Zeitpunkt weit in der Vergangenheit)" mitschicke. Ist nur nicht ganz sinn der Sache, denn wenn die Datei gleich ist, darf er sie gerne Cachen bzw. soll das auch.

Wäre das jetzt ein Script wärs ja kein Thema, dann könnte ich den Client ja per Header zum revalidieren verpflichten...

Irgend ne Idee, wie man das lösen könnte?

Im Grunde soll er sich nur so verhalten wie wenn es ein normaler Webseitenaufruf wäre und den Cache auch mal überprüfen.


Danke schonmal,
Martok


Heiko - Di 24.03.09 17:05

Hast du Zugriff auf den Server? Wenn ja: Etag ist das richtige für dich. Bei dir wird scheinbar der max-age-Header gesendet. Ist das möglich?


Martok - Di 24.03.09 17:31

Ja, auch ETags werden mitgesendet und ignoriert.

Ich könnte auch ein 'if-none-match:' mitsenden, mir gehts nur darum, den FF reinzulegen so dass er den Request auch wirklich ausführt. Das scheint nur zu gehen, indem man *irgendwas* Cache-Betreffendes in den Header schreibt.


Heiko - Mi 25.03.09 00:01

Hast du Demo-Code? Also php + FF-Bsp?


Martok - Mi 25.03.09 00:46

Glaubs mir, da gibts keine PHP ;)

Und ansonsten reicht das:
1. Prototype einbinden (ich hab die aktuelle, also 1.6.0.3)

2. Ajax.Request erzeugen:
1:
2:
3:
4:
5:
6:
7:
8:
9:
new Ajax.Request('some/file.txt', {
  method:'get',
  asynchronous: false,
  evalJS: false,
  requestHeaders: [ 'if-modified-since''Sat, 1 Jan 2000 00:00:00 GMT'],
  onSuccess: function(response)  {
     //whatever
  }
});

3. Rumprobieren...

Mal mit und mal ohne die Headers probieren und dann im Network-Tab vom Firebug gucken was passiert. Oder eben nicht passiert: das erste mal nach Cache-Löschung klappt immer normal, danach wird der Request gar nicht mehr abgeschickt sondern wird direkt ausm Cache bedient. Alternativ zum Header könnte ich auch einen zufälligen Query-String an die URL anhängen, aber das ist ja auch nicht Sinn der Sache.

EDIT: interessant. Es hängt auch noch vom content-type der Daten ab, oder so.
Ich hab mal ein kleines Test-Projekt geschraubt, hier ist es [http://www.martoks-place.de/test/ajax/]. Das ganze gibts im Anhang nochmal als zip.

Man sieht, dass das Caching-Verhalten relativ chaotisch ist. Das einzige was geht, ist das "immer neu laden" wenn man den Cache ganz ausschaltet, sei es per WebDeveloperToolbar oder Request-Header ;)


GTA-Place - Mi 25.03.09 08:45

Eigentlich doch ganz normal, dass eine Textdatei nur aus dem Cache geladen wird. Normalerweise ändern sich Textdateien ja auch nicht. Wie sieht es bei XML aus?