2014-09-19 6 views
11

Ich habe eine AJAX-Aktion, die je nach Datenmenge einige Minuten dauern kann. Wenn ein Benutzer frustriert ist und weg navigiert, während diese Aktion noch läuft, was passiert dann mit dem Controller? Ist es trotzdem fertig? Weiß es, dass die Anfrage aufgegeben werden sollte und das Controller-Objekt entsorgen?Was passiert mit einem ASP.NET MVC-Controller, wenn der Benutzer weg navigiert, bevor eine Antwort empfangen wird?

+3

Ich denke, die genaueste Antwort ist "vielleicht", und der Ansatz ist, "ja" anzunehmen. Der serverseitige Code wurde aufgerufen und wird verarbeitet. Das Abbrechen der Anfrage (* wenn * der Browser den Server über irgendetwas informiert) kann den Webserver auf der HTTP-Ebene benachrichtigen, dass er abgebrochen werden kann, aber das bedeutet nicht notwendigerweise, dass der Anwendungscode nicht mehr ausgeführt wird. Der Anwendungscode könnte wie üblich einfach vervollständigt werden und der Webserver ignoriert einfach die Antwort. Oder der Server kann auf den Client antworten und der Client ignoriert die Antwort. In beiden Fällen ist die Steuerung normal angeordnet. – David

+0

Dispose wird aufgerufen, nachdem die Ansicht in _any_ case gerendert wurde. In Ihrem Szenario wird der Controller die Ansicht weiterhin vollständig rendern, die gerenderte Ansicht wird jedoch nicht an den Client gesendet. –

+0

Definitiv hätte der Controller keine Möglichkeit zu wissen, dass der Benutzer die Website verlassen hat und die Ausführung fortsetzen wird. Die Antwort wird wahrscheinlich vom Browser ignoriert werden – Catalin

Antwort

8

Die Anforderung an den Server wird nicht abgebrochen, da beim Navigieren keine Informationen an den Server bezüglich dieser Anforderung gesendet werden. Der Client (Browser) hört jedoch auf, darauf zu hören. Nachdem die Anforderung abgeschlossen wurde, wird der Controller unabhängig davon, ob der Client auf ihn gewartet hat oder nicht, wie üblich disponieren.

Mit diesem gesagt, könnten Sie Phantasie und eine Kombination von hören für eine Änderung der Seite auf der Clientseite und abort auf die AJAX-Anfrage an den Server zu bekommen.

This SO question discusses wie Sie eine Anfrage abbrechen. Ich könnte mir vorstellen, eine Variable zu setzen, wenn Sie die AJAX-Anfrage zum ersten Mal starten und dann nach dem Beenden wieder aufheben.

Warnung - Pseudo-Code unten

var isProcessing = false; 

var xhr = $.ajax({ 
    type: "POST", 
    url: "myUrl", 
    beforeSend: function(){ 
     isProcessing = true; 
    } 
    complete: function(){ 
     isProcessing = false; 
    } 
}); 

window.onbeforeunload = function(){ 
    if(isProcessing){ 
     xhr.abort(); 
    } 
} 

Die oben ist sehr Grundidee des Konzepts, aber es sollte wohl einige Kontrollen um, wenn das XHR-Objekt vorhanden ist, vielleicht auch binden/unbind die window.onbeforeunload in Die beforeSend- und Complete-Objekthandler für den Artikel .ajax().

+0

Danke für Ihre Antwort. Die Antwort auf diese SO-Frage scheint zu implizieren, dass abort() die serverseitige Aktion nicht beendet. Ist das wahr? http://stackoverflow.com/questions/4551175/how-to-cancel-abort-jquery-ajax-request –

+0

Kompliment an Erv Walter der Frage, die Tommy in seiner Antwort geschrieben hat "Beachte, wenn der Server bereits den Anfrage, kann es die Verarbeitung der Anfrage fortsetzen (abhängig von der Plattform des Servers), obwohl der Browser nicht mehr auf eine Antwort wartet.Es gibt keine zuverlässige Möglichkeit, den Webserver bei der Verarbeitung einer Anfrage in seinen Spuren anzuhalten Fortschritt " – CSharper

+1

@RaySaltrelli - Ich muss C Sharper zustimmen, dass es keine endgültige Antwort gibt. Ich würde sagen, es ist sicher anzunehmen, dass sobald der Server die Anfrage erhält, wird er höchstwahrscheinlich weiter machen, was ihm gesagt wurde. Ich denke, der Unterschied in allen Informationen besteht in Browser, Server und Code. Mit dem gesagt, es gibt einige spärliche Informationen darüber, wie Sie die Anfrage mit Aufgaben und Stornierungstoken stornieren konnten, jedoch habe ich relativ wenig Erfahrung damit. https://github.com/ermagana/AsyncCancelExample – Tommy

Verwandte Themen