Kleine Ursache - große Wirkung: Lange Ladezeiten im Firefox von Nocturne zum Thema Auf den Spuren des Problems - Fr, 27.03.2009

Seit einigen Wochen sind mir bei einer meiner ASP .NET Webanwendungen im Firefox verhältnismäßig lange Ladezeiten aufgefallen, die seltsamerweise teilweise merklich länger als beim Internet Explorer waren. Nicht selten schien Firefox die Seite bereits geladen zu haben, doch der Ladebalken verschwand erst einige Sekunden später. Auch war ein genereller Anstieg der SQL-Benutzerverbindungen festzustellen, was ich aber zunächst nicht damit in Verbindung brachte und ich mir einfach mit gesteigertem Benutzeraufkommen erklärte.

Als ich dann neulich mal wieder beim Debuggen eines neuen Features war, fiel mir auf dass das Page_Load-Event meiner Seite seltsamerweise doppelt ausgelöst wird. Daraufhin ging ich Schritt für Schritt das gesamte Projekt durch und schnell stellte sich heraus, dass das im benutzerdefinierten HTTP-Modul registrierte BeginRequest-Ereignis genauso doppelt aufgerufen wurde wie die Load-Events aller Controls. Es hatte also den Anschein, als würde irgendwo am Ende der Seitenverarbeitung eine Umleitung zur selben Seite stattfinden. Doch so sehr ich auch suchte, ich konnte nichts dergleichen finden.

Die Angelegenheit wurde noch merkwürdiger als ich dann mal durch einen Zufall feststellte, dass der Internet Explorer und etliche andere Browser dieses Verhalten nicht aufzeigen. Mit Ausnahme des auf dem Firefox basierendem Flock-Browser, schien sich das Problem lediglich in Firefox reproduzieren zu lassen. So unverständlich das zunächst auch war, war es doch eine wichtige Erkenntnis: erstens wusste ich nun weshalb Firefox im direkten Vergleich zum IE länger brauchte um eine Seite meines Projekts zu laden. Zweitens ließ sich so ein Fehler im Code-Behind nahezu ausschließen, denn der wird ja schließlich - unabhängig vom Browser - auf dem Server ausgeführt. Da ich einen Bug im Framework zunächst ausschloss, widmete ich mich dem clientseitigem Code meiner Anwendung. Doch selbst nachdem ich JavaScript komplett deaktivierte, trat das Problem noch auf. Konnte also das HTML-Markup dafür Verantwortlich sein?

Um diese Frage zu klären erstellte ich zwei neue Seiten in meinem Projekt: die erste Seite war eine ContentPage und verwendete die Masterpage wie auch der Rest des Projektes. Die zweite Seite war ein normales Webform ohne Masterpage. Es zeigte sich, dass der Fehler nur bei Verwendung der Masterpage auftrat. Obwohl ich den Code-Behind als Ursache bereits ausgeschlossen hatte, bestätigte diese neue Erkenntnis dass sämtlicher Code im Zusammenhang mit der Session- und Request-Verarbeitung nun definitiv nicht dafür verantwortlich sein kein.
Aber zurück zur Masterpage: es war nun also sehr wahrscheinlich dass das von der Masterpage generierte Markup dafür verantwortlich sein musste, dass der Firefox jeden Request doppelt abarbeitet. Das grenzte die Ursache schon mal erheblich ein, sodass ich dazu überging die Masterpage nach und nach zu bereinigen. Ich löschte also nacheinander alle Web-Controls und HTML-Tags solange bis ich schließlich die Ursache fand. Ich habe in dem Projekt eine Livesuche integriert, die bereits beim Tippen eines Suchbegriffs Suchvorschläge aus der Datenbank generiert und dynamisch ein Vorschaubild lädt, wenn man mit der Maus oder den Pfeiltasten eines dieser Vorschläge markiert. Genau dieses Bild war die Ursache. Es wurde so in die Masterpage eingebunden:

HTML
1 <img id="PrevImg" src="" />

Ein JavaScript ändert dann dynamisch beim Durchstöbern der Suchvorschläge das src-Attribut des Bildes wodurch dieses dann angezeigt wird. Im Firefox sorgt das leere src-Attribut dafür dass dieser die komplette Seite noch einmal lädt. Es scheint so, als würde Firefox dann die aktuelle URL als Pfad für das Bild verwenden, wodurch der Server den Request nochmal abarbeitet. Abhilfe schaffte in dem Fall übrigens das Verlinken eines transparenten Pixel-GIFs. Wie bereits oben schon erwähnt, scheint ausschließlich Firefox dieses Verhalten zu zeigen, was prinzipiell kein Problem ist wenn man valides HTML schreibt

Und was lernen wir daraus? (In-)Valides Markup ist nicht nur was für HTML Validatoren sondern kann durchaus auch ernsthafte Probleme nach sich ziehen, weshalb ich zum Schluss die Wikipedia zum Thema Schmetterlingseffekt zitieren möchte:

Als Schmetterlingseffekt (engl. butterfly effect) bezeichnet man den Effekt, dass in komplexen, dynamischen Systemen eine große Empfindlichkeit auf kleine Abweichungen in den Anfangsbedingungen besteht. Geringfügig veränderte Anfangsbedingungen können im langfristigen Verlauf zu einer völlig anderen Entwicklung führen.
Explorer Menüleiste lässt sich in Vista ...Kate 2.1 komplett vom iPod Touch / iPhone lös...