Wie HTTP-Long-Polling den Seitenreload kaputt machen kann
Ich hatte ein Problem mit meiner Web-App, die mittels HTTP-Long-Polling auf Neuerungen eines Servers wartete. Dabei geht es um “Fake-Push-Benachrichtigungen” mittels einer Verbindung zum Server, die so lange aktiv bleibt, bis der Server antwortet. Und der Server antwortet (auf einer bestimmten URL) erst, wenn es eine Neuerungen gibt. Dabei kann aber ein großes Problem resultieren und ich habe lange gebraucht, bis ich endlich wusste was genau das Problem war.
Wenn ihr HTTP-Long-Polling einsetzt und sich zu jedem Zeitpunkt euer Anwendung mindestens eine Anfrage im Pending-Status befindet und ihr eins der folgenden Probleme bei euch wahrnehmt, dann kann ich euch vermutlich des Rätsels Lösung verraten:
- Beim ersten Aufruf eurer Anwendung läuft alles super und die Server-Informationen werden mittels AJAX über eine URL, die ihr euch für eure HTTP-Long-Polling-Requests ausgesucht habt ausgeführt beziehungsweise abgerufen
- wenn ihr die Seite neu ladet, dann lädt sie ewig beziehungsweise gar nicht, wenn ihr den XMLHttpRequest mit abort() manuell abbrecht klappt es aber plötzlich
- wenn die Seite nicht lädt, ihr aber im Inkognito-Modus oder einem anderen Browser die Seite problemlos erreichen könnt
- das auf eurem Server aber nicht im (XAMPP) localhost passiert
Des Rätsels Lösung
Ich dachte zuerst es ist ein browserseitiges Problem, so dass nicht beendete Anfragen an einen Server weitere Anfragen blockieren. Doch es liegt tatsächlich daran, dass Server so konfiguriert sein können, dass wenn eine (AJAX-)Anfrage nicht korrekt beendet wird, weitere Anfragen abgewiesen beziehungsweise auf die Warteliste gesetzt werden. Mir fehlen die Möglichkeiten das auch serverseitig genauer zu debuggen (Server sind von all-inkl.com) und außerdem fehlen mir da wohl Kenntnisse von HTTP und Apache.
Zusammengefasst
Nutzt lieber kein HTTP-Long-Polling sondern schaut euch richtige Push-Benachrichtigungen an. Ich habe so lange gesucht bis ich endlich wusste, was das Neuladen der Seite verursacht hat. Der Server hat einfach weitere Anfragen von diesem Client nicht verarbeitet. Übrigens, ein abort()-Aufruf auf allen XMLHttpRequest-Objekten funktioniert, aber nur wenn das irgendwie manuell angestoßen wird. Im window.onunload-Event funktioniert zumindest bei mir ein abort()-Aufruf auf den offenen XMLHttpRequest-Objekten nicht. Es gibt also wohl keine Möglichkeit Anwendungen dieser Art mit HTTP-Long-Polling umzusetzen, wenn die Server entsprechend konfiguriert sind. Schaut euch lieber richtige Push-Lösungen an um eure Clients mit Informationen zu versorgen.
0 Comments