Mister Z: XMLHttpRequest wird gecachet?

Hallo :)

ich betreibe ein Browsergame, das den XMLHttpRequest zum Aktualisieren eines Chats nutzt.

Das XMLHttpRequest gibt eine '1' aus, wenn es etwas zu Aktualisieren gibt, und ruft dann ein anderes Script auf, dass die neuen Nachrichten dann an den Chat anhängt.
Ergo wird immer, wenn der XMLHttpRequest eine '1' zurück gibt, aktualisiert.

Seit geraumer Zeit hat Firefox (bei anderen Browsern habe ich noch keine Probleme bemerkt) eine seltsame Macke: Er scheint das Ergebnis des XMLHttpRequests zu "cachen", sodass unaufhörlich aktualisiert wird. Dann cachet er auch noch die Aktualisierungsseite, was zur Folge hat, dass unaufhörlich dieselbe Nachricht wieder in den Chat geschrieben wird.

Das Seltsame an der Sache: Das Ganze tritt mal auf und mal nicht, bei verschiedenen Versionen von FF (bspw. 3.1.4 und 3.5.2) und auch unter verschiedenen Betriebssystemen (getestet: Linux + Windows).
Des Weiteren haben manche Leute dauerhaft das Problem und manche so gut wie nie...

Hat da einer von euch eine Idee, was das für ein Fehler ist? Es liegt auch nicht direkt an meinem Script, in einem Chat, der ähnlich aufgebaut war (von einem anderen Spiel) gab es den gleichen Fehler (zumindest bei mir)!

Es scheint sich ja um ein allgemeines Problem zu handeln.

Vielen Dank schon einmal fürs Lesen ;-)

Viele Grüße,

Mister Z

  1. Hallo, Mister Z!

    Cachen kann man ganz einfach unterbinden, indem man dem Request einen zusätzlichen GET-Paramter, bspw. einen Timestamp, mitgibt. Den dazu benötigten Timestamp kann man bspw. leicht mit (new Date()*1) bekommen.

    Gruß, LX

    --
    RFC 1925, Satz 8: Es ist komplizierter als man denkt.
    1. Cachen kann man ganz einfach unterbinden, indem man dem Request einen zusätzlichen GET-Paramter, bspw. einen Timestamp, mitgibt. Den dazu benötigten Timestamp kann man bspw. leicht mit (new Date()*1) bekommen.

      Von diesem Caching der Requests ist aber - zumindest lt. jQuery-Doku - nur der Internet Explorer betroffen:

      "Note: Keep in mind that Internet Explorer caches the loaded file, so you should pass some extra random GET parameter to prevent caching if you plan to call this function more than once"

      1. Hallo!

        Alternativ kannst Du auch einen POST-Request benutzen.

        Grüße

        1. Hallo,

          Vielen Dank für eure Antworten!

          Cachen kann man ganz einfach unterbinden, indem man dem Request einen zusätzlichen GET-Paramter, bspw. einen Timestamp, mitgibt. Den dazu benötigten Timestamp kann man bspw. leicht mit (new Date()*1) bekommen.

          Das werde ich auf alle Fälle mal ausprobieren, danke.

          Von diesem Caching der Requests ist aber - zumindest lt. jQuery-Doku - nur der Internet Explorer betroffen:

          Dann werde ich einfach direkt mal einen Parameter übergeben, vielleicht klappt das ja.

          Alternativ kannst Du auch einen POST-Request benutzen.

          Aber könnte ein POST-Request nicht nach derselben Form gecachet werden? Eigentlich ist das Cachen eh unsinnig (seit wann cachet man .php-Seiten?!). Vielleicht ist es ein anderer Fehler...

          Viele Grüße,

          Mister Z

          1. Ich habe soeben mal die Methode mit dem Date-String ausgetestet und bin eindeutig zu dem Schluss gekommen, dass sie das Problem nicht löst.

            Was kann denn das sein? Ein allgemeiner Firefox-Fehler? Das wäre aber sehr schlecht...

            1. Hi,

              Ich habe soeben mal die Methode mit dem Date-String ausgetestet und bin eindeutig zu dem Schluss gekommen, dass sie das Problem nicht löst.

              Dann hast du höchstvermutlich etwas falsch gemacht, oder dein Problem ist ein anderes, als du denkst.

              Wenn du einen GET-Parameter in einer Adresse veränderst (auf einen neuen, bisher noch nicht benutzten Wert), dann handelt es sich im eine komplett neue Ressource - die *kann* noch nicht gecached worden sein, weil sie zuvor noch gar nicht angefordert wurde.

              (Dass ein Browser in der Hinsicht buggy wäre, ist zwar theoretisch möglich, praktisch aber eher schwer vorstellbar.)

              MfG ChrisB

              --
              Light travels faster than sound - that's why most people appear bright until you hear them speak.
              1. Hi,

                Dann hast du höchstvermutlich etwas falsch gemacht, oder dein Problem ist ein anderes, als du denkst.

                Ich tippe auf die zweite Möglichkeit - Frage ist dann aber: Welches Problem ähnelt einem Cache-Problem?
                Wenn eine Seite entweder 1 oder nichts zurückgibt - wo kann dann der Fehler liegen, wenn sie immer 1 zurückgibt (abgesehen vom Script selbst, dass ganz sicher richtig ist)?

                Wenn du einen GET-Parameter in einer Adresse veränderst (auf einen neuen, bisher noch nicht benutzten Wert), dann handelt es sich im eine komplett neue Ressource - die *kann* noch nicht gecached worden sein, weil sie zuvor noch gar nicht angefordert wurde.

                Ganz meine Meinung!

                (Dass ein Browser in der Hinsicht buggy wäre, ist zwar theoretisch möglich, praktisch aber eher schwer vorstellbar.)

                Aber woran liegt es dann? Das Betriebssystem ist genauso unwahrscheinlich.
                Mich wundert es auch, da Firefox sonst eigentlich (so gut wie) nie Fehler hat...

                Gruß,
                Mister Z

                1. Dann hast du höchstvermutlich etwas falsch gemacht, oder dein Problem ist ein anderes, als du denkst.

                  Ich tippe auf die zweite Möglichkeit - Frage ist dann aber: Welches Problem ähnelt einem Cache-Problem?
                  Wenn eine Seite entweder 1 oder nichts zurückgibt - wo kann dann der Fehler liegen, wenn sie immer 1 zurückgibt (abgesehen vom Script selbst, dass ganz sicher richtig ist)?

                  Dann liegt es 100% daran, dass du etwas falsch machst.

                  Struppi.

                  1. Aber kann es sein, dass ich und andere zufälligerweise denselben Fehler machen, der dann aber erst nach ein paar Jahren auffällt? Das ist schon seltsam...
                    Ich poste hier einfach mal mein Script:

                      
                    var xmlHttpObject = false;  
                      
                    function createRequester()  
                    {  
                    	if (typeof XMLHttpRequest != 'undefined')  
                    		xmlHttpObject = new XMLHttpRequest();  
                      
                    	if (!xmlHttpObject)  
                    		try  
                    		{  
                    			xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP");  
                    		}  
                    		catch(e)  
                    		{  
                    			try  
                    			{  
                    				xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");  
                    			}  
                    			catch(e)  
                    			{  
                    				xmlHttpObject = false;  
                    			}  
                    		}  
                    	return xmlHttpObject;  
                    }  
                      
                    function startRequest()  
                    {  
                        if(xmlHttpObject.readyState == 4 || xmlHttpObject.readyState == 0)  
                    	{  
                          	xmlHttpObject.open('GET','request.php?'+(new Date()*1), true);  
                    	    xmlHttpObject.onreadystatechange = handleRequest;  
                    	  	xmlHttpObject.send(null);  
                    	}  
                    }  
                      
                    function handleRequest()  
                    {  
                        if(xmlHttpObject.readyState == 4)  
                        {  
                            window.setTimeout('startRequest()', 1500);  
                            if(xmlHttpObject.responseText.length==1)  
                                parent.reload.location.href = "reload.php";  
                        }  
                    }  
                      
                    xmlHttpObject = createRequester();  
                      
                    startRequest();  
                    
                    
                    1. if(xmlHttpObject.responseText.length==1)
                                  parent.reload.location.href = "reload.php";

                      Ich dachte der response gibt eine 1 zurück?
                      Ich würde den Fehler eher hier vermuten, aber wir kennen das ganze Szenario nicht. Ansonsten ist der Rest des Code soweit in Ordnung, dass Fx auf jeden Fall nicht cached (auch ohne Date() Objekt sollte er es nicht und tut es auch nicht. Nach meiner Erfahrung cached eher der IE als Fx).

                      D.h. dein Problem läßt sich nicht anhand des Codes und deiner Beschreibung nachvollziehen.

                      Struppi.

                      1. Der Response-Text gibt auch eine 1 zurück - aber es ist egal, ob ich nun den responseText oder dessen Länge überprüfe ;-)

                        Immerhin ist der Code OK, danke für die Überprüfung.

                        Ich werde mich jetzt mal im offiziellen Firefox-Forum melden. Vielleicht ist es wirklich ein FF-Fehler (zwar kaum vorstellbar, aber wer weiß...).

                        Schönen Dank euch allen :)