Frage

Hier sind die Angaben:

  • ASP.NET 3.5 mit ASP.NET AJAX
  • AJAX Control Toolkit
  • jQuery 1.3.2
  • Web-Services
  • IIS6 auf Windows Server 2003 SP1
  • SP1 SQL Server 2005 SP3-Site ist SSL
  • Infragistics Web Components 2009 Vol. 2 (unter Verwendung von nicht-Aikido Kontrollen), UltraWebGrid und Baumsteuerung wichtigsten ist verwendet.

Hier ist das Problem: Ich erhalte die White Screen of Death (WSOD) in IE 7/8. Grundsätzlich habe ich eine Seite, die einen linken Bereich hat, der eine AJAXControl Toolkit Akkordeon Kontrolle hat, wo jeder Akkordeon Scheiben Inhalt ein Infragistics Tree Control ist. Der rechte Bereich ist ein <div>, die einen <iframe> dessen Inhalt neu geladen wird auf das, was in der linken Menüfenster angeklickt wird.

In der <iframe>, eine Seite mit einem oder mehreren UltraWebGrid Kontrollen Lasten auf, wenn Sie klicken Sie auf einen Menüpunkt auf der linken Seite. Die Gitter alle havea Templat-Knopfspalte. Wenn Sie auf die Schaltfläche Bearbeiten eines Gitters klicken, um ein Popup-Fenster zu bearbeiten Zeile der Datensatz geöffnet wird. Dies funktioniert gut für etwa zehn Mal und dann auf dem zehnten Mal (manchmal früher), öffnet sich das Popup-Fenster mit der richtigen URL in der Adressleiste, aber die Seite nicht geladen wird.

Wir haben eine Anwendung, die ein Popup-Fenster für die Aktualisierung Datensätze verwendet. Die meiste Zeit, wenn Sie klicken Sie auf die Schaltfläche [Bearbeiten] zu bearbeiten einen Datensatz, das Popup-Fenster öffnet sich und lädt die Update-Seite. Doch nach Aufzeichnungen für einen während der Bearbeitung, ganz plötzlich das Popup-Fenster wird geöffnet, aber es bleibt leer und gerade hängt. Die URL ist in der Adressleiste.

Einladendes Fiddler Ich bemerkte, dass die Anforderung für die Update-Seite wird nie was dazu führt, der mich gesandt hat eine Art Überbrückungs zu glauben, dass es auf der Client-Seite. Wenn ich die gleiche URL kopieren, die in ein neues Browserfenster im Popup-Fenster ist, wird die Seite im Allgemeinen Last in Ordnung.

Beobachtungen:  - Da der Antrag nicht an den Server gesendet, es ist auf jeden Fall etwas clientseitige oder verwandten Browser.  - Erscheint nur geschehen, wenn es einen Anschein von Verkehr auf der Seite ist, die seltsam ist, weil dies scheint in clientseitigen Code enthalten zu sein  - Es gibt eine Web-Service im Hintergrund überprüft alle paar Sekunden aufgerufen wird, wenn der Benutzer angemeldet ist, aber dies nicht dazu führt, das Einfrieren

.

Ich bin hier mit einem Verlust wirklich. Ich habe WSOD gegoogelt aber nicht scheint, viel zu meinem spezifischen WSOD Bezug zu erscheinen. Irgendwelche Ideen?

Was ist das Problem wirklich ist

schaltet also die Speicherlecks aus (obwohl ich habe einige auf der Client-Seite abgedichtet) ist nicht das Problem. Das Problem ist, Web-Service-Anrufe auf der Client-Seite gemacht. Es ist eine, die überprüft, ob ein Benutzer auf alle 4 Sekunden angemeldet ist (für die Synchronisierung mit einem anderen Fenster) und dann gibt es Web-Service-Anrufe Benutzereinstellungen für ein Popup-Fenster und Netzzustand zu erhalten. Von dem, was ich gelesen habe, hat der Web-Service asynchron sein. Ich nahm an, indem sie von JavaScript mit Erfolg Aufruf / Fail-Rückrufe, dass sie asynchron, aber sie sind wirklich nicht. Sie sind asynchron aus der Client-Seite / Browser Sicht, sondern von der Server-Seite, wird der Anruf an den Webservice wird und kehrt zurück, wenn sie abgeschlossen ist jede Operation hält, da es eine begrenzte Anzahl von Verbindungen ist.

Also, was ist der einfachste Weg, um nur die Web-Service-Methoden asynchron zu machen? Hat der Web-Service-Bedarf zu einem WCF-Web-Service umgewandelt werden oder kann ich meine bestehende ASP.NET Web-Service-Aufruf verwenden?

Und für historische Zwecke, hier ist das, was ich dachte, das Problem war ursprünglich:

war ich nicht in der Lage diese lokal zu reproduzieren oder auf unseren Testservern. Aber ich habe Fiddler zu simulieren Modemgeschwindigkeiten und plötzlich kann ich die WSOD auf meinem lokalen PC replizieren. So scheint es eine langsame oder vorübergehend langsame Verbindung zu sein, wenn ein Popup-Fenster zu öffnen, dass es zumindest in meiner Testumgebung zu ersticken verursacht.

Ich habe einen weiteren Test läuft IE ohneAdd-ons, iexplore.exe -extoff, aber am Ende mit dem gleichen Ergebnis auf. Ich reparierte auch ein Problem, wo die iframe auf der Seite jedes Mal die URL geändert für die iframe neu erstellt wurde. Ein Teil meiner Logik weggelassen wurde. Nun wird die iframe nur einmal erstellt. Danach nur das src Attribut aktualisiert, wenn ich neue Inhalte geladen werden soll ... meine Patzer. Ich bemerkte einige verweilende Fenster Referenzen in JavaScript Schließungen, so dass nun diejenigen in den Verschlüssen explizit auf null gesetzt, wenn ich mit ihnen fertig bin.

Ich habe auch einige Speicherleck Untersuchung durchgeführt:  - Soweit ich sagen kann, ich habe keine zirkulären Referenzen im DOM und JavaScript oder anderen Leck Mustern hier erwähnt, http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa

  • Ich habe den Crockenator des Purge-Code für IE Speicherlecks (siehe hinzugefügt http://www.crockford.com/javascript/memory/leak.html ):

    $ (document) .ready (function () {     Funktion Spülung (d) {         var a = d.attributes, i, l, n;

        if (a) {
            l = a.length;
    
            for (i = 0; i < l; i += 1) {
                if (a[i]) {
                    n = a[i].name;
    
                    if (typeof d[n] === 'function') {
                        d[n] = null;
                        purgeCount++;
                    }
                }
            }
        }
    
        a = d.childNodes;
    
        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                purge(d.childNodes[i]);
            }
        }        
    }        
    
    $(window).unload(function() {
      purge(document.body);
      //alert("purge count: " + purgeCount);
    });
    

    });

Keiner meiner Verbesserungen haben das Problem behoben. in meinem lokalen Testszenario. Irgendwelche Ideen? Jemand? Jemand? Bueller?

Letzte Aktualisierung

Danke David für den Hinweis auf, dass es Sitzungszustand war, die Probleme in den Web-Diensten verursacht. „ASP.NET Warteschlangen alle Anforderungen an die gleiche‚Sitzung‘. Wenn also die ersten Anforderungsblocks zu lange, wird es keine andere Anforderungen in der Warteschlange halten.“

Also, was wir tun, am Ende war versuchen, Web-Services zu minimieren Sitzungsstatus verwenden, aber wir auch die empfohlenen Einstellungen von Microsoft für die Anzahl der Verbindungen finden Sie unter http://msdn.microsoft.com/en-us/library/ff647786.aspx#scalenetchapt10_topic9

War es hilfreich?

Lösung

ich glaube, Sie können mit Sitzungsanforderung Synchronisation ein Problem werden muss. Haben Sie markieren Ihre Web-Service-Handler als erforderlich Sitzungsstatus?

ASP.NET Warteschlangen alle Anforderungen an die gleiche „Sitzung“. Wenn also die ersten Anforderungsblocks zu lange, wird es keine andere Anforderungen in der Warteschlange halten. Sie können Sitzungsstatus für die Seite deaktivieren, dies zu vermeiden und wirklich asynchron sein, aber Sie werden für den Zugriff Sitzung auf dem Server nicht in der Lage sein, etc.

Wenn Sie .ashx verwenden, Sie haben eine Schnittstelle zu verwenden, um Zugang zu dem Sitzungsstatus zu bekommen, ist die Standard-off, so überprüfen, ob Sie eine dieser Schnittstellen hinzugefügt und entfernt werden, wenn möglich:

public class FooHandler : IHttpHandler, IReadOnlySessionState // readonly access

public class FooHandler : IHttpHandler, IRequiresSessionState // read-write access

Wenn Sie eine ASPX-Seite verwenden, es standardmäßig aktiviert ist, und Sie müssen es drehen mit einem Page-Direktive Attribute aus:

    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
AutoEventWireup="false" Inherits="WebApplication1.WebForm1"
EnableSessionState="false" %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top