Antwort.Flush() funktioniert nur mit Firefox
Ich versuche zu senden, einige Inhalte an den client, bevor Sie einige langwierige Arbeit:
Response.Write("Processing...");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();
In Firefox funktioniert es wie erwartet, aber in IE8, Safari und Chrome wartet er, bis alle den code verarbeitet wird und zeigt dann den gesamten text.
Ich habe versucht, das senden einer besser gebildeten HTML-wie der im folgenden Beispiel, aber ich bekomme die gleichen Ergebnisse:
Response.Write("<html><head><title>test</title></head><body>Processing...</body></html>");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();
Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem, das Sie konfrontiert sind, ist, dass die Antwort, die Sie senden, ist noch unvollständig. Auch wenn Sie bündig ist, was in den Puffer des Browsers, ist es immer noch Sache des Browsers, die Antwort zu warten-Ende oder verarbeiten das es so weit gekommen - daher der Unterschied zwischen den Browsern.
Was noch schlimmer ist, dass können Sie erwarten das gleiche Verhalten von einigen Zwischenknoten Konzentratoren, firewalls, etc. sich über das internet zwischen Ihrem server und dem browser.
Die Quintessenz ist, dass, wenn Sie wollen, um sicherzustellen, dass browser macht das etwas mit Ihrem Datenstrom die Sie haben, um es mit der Antwort.Ende.
In anderen Worten, wenn Sie möchten, senden einige von Ihren response-Daten, die erste und delay senden Sie den rest Ihre bessere option ist, zu brechen, die Reaktion in zwei, komplett die erste und laden Sie den zweiten Teil separat
Einen einfachen Weg, diese zu lösen ist, um ein "Bitte warten, wird verarbeitet" Seite vor die eigentliche Seite, die die Arbeit macht. Die Nachricht "bitte warten" wird angezeigt, und dann beginnt sofort die Verarbeitung durch die Verwendung eines meta-refresh-tag und/oder javascript-redirect auf die eigentliche Verarbeitung Seite.
"Bitte Warten" - Seite:
Hinweise:
Beachten Sie auch, dass, wenn Ihr IIS-server ist die Komprimierung der Ausgabe mit GZIP, dann wird es scheinen, zu ignorieren
Response.Flush
Anrufe.Dies ist standardmäßig aktiviert, im IIS7 und Windows 7.
Und, wenn Sie den Test mit Fiddler, schalten Sie auf "Streaming" - Modus, oder Fiddler sammeln die geleert HTML und halten Sie Sie, bis die Verbindung abgeschlossen ist.
Beim Aufruf Antwort.Flush() auf, bevor die Reaktion abgeschlossen ist (bevor die Content-Length bekannt ist), die ASP.NET runtime generiert eine chunked-encoding partial response. Es ist dem browser zu entscheiden, wie Sie die Darstellung. In meinen Tests habe ich festgestellt, dass Browser dazu neigen, um das Rendern von Bildern (
<img>
- tags) enthalten sind, in eine partielle Remission. Sie könnten probieren.Seien Sie jedoch vorsichtig über das senden von
</html>
zu früh; Browser ignoriert alles, was über diesen Punkt. Browser render partial Seiten die ganze Zeit, obwohl-so können Sie beginnen mit dem Anfang der Seite ist, wie gewohnt.In einem Fall ist es hilfreich, gehe ich durch ein Beispiel im detail in meinem Buch, einschließlich ein packet trace zeigt genau, was passiert auf der Leitung: Ultra-Schnell ASP.NET.
Ich denke, Browser, abrufen und verwenden der Inhalte anhand Ihrer Länge, so können Sie versuchen, die Polsterung 1000 chars oder so. Zum Beispiel:
string myVeryShortMessage = "Processing...";
Antwort.Schreiben(myVeryShortMessage.PadRight(1000));
Antwort.Flush();
System.Threading.Thread.Sleep(5000);
Antwort.Write("Fertig Stellen".PadRight(1000));
Antwort.Flush();