Frage

Ich versuche, einig Inhalt an den Client zu senden, bevor eine langwierige Arbeit zu tun:

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 es wartet, bis der gesamte Code verarbeitet wird, und zeigt dann den ganzen Text.

Ich habe versucht, einen besseren HTML nicht wie die unten Probe zu senden, 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!

War es hilfreich?

Lösung

Das Problem ist, Sie konfrontiert sind, dass die Antwort die Sie senden die noch nicht abgeschlossen ist. Auch wenn Sie spülen, was in den Puffer an den Browser ist, ist es noch bis zu den Browser für die Antwortende warten oder verarbeiten, was es so weit gekommen ist - daher der Unterschied zwischen den Browsern.

Was noch schlimmer ist, dass Sie das gleiche Verhalten von einigen Zwischenknoten Konzentratoren erwarten können, Firewalls usw. auf dem Internet zwischen Ihrem Server und dem Browser.

Das Endergebnis ist, dass, wenn Sie diesen Browser etwas tut, um sicherzustellen, möchten mit Ihren Daten streamen Sie es mit Response.End abgeschlossen haben.

Mit anderen Worten, wenn Sie wollen zunächst einige Ihrer Antwortdaten senden und Verzögerung Sendet den Rest Ihre bessere Option ist die Antwort in zwei zu brechen, füllen Sie die ersten und laden Sie den zweiten Teil getrennt

Andere Tipps

Eine einfache Möglichkeit, dies zu lösen, ist eine platzieren „Bitte warten Sie, Verarbeitung“ Seite vor der aktuellen Seite, die die Arbeit erledigt. Die „Bitte warten“ angezeigt wird, und dann geht es sofort die Verarbeitung durch einen Meta-Refresh-Tag und / oder Javascript zur eigentlichen Verarbeitung Seite umgeleitet werden.

"Bitte warten" Seite:

<html>
<head>
  <meta http-equiv="refresh" content="0;url=process.aspx?option1=value&...." />
  <title>Please Wait, Processing</title>
</head>
<body>
  Processing...
</body>
<script type="text/javascript">
  window.location = "process.aspx?option1=value&....";
</script>
</html>

Weitere Informationen:

  1. Mit zwei Methoden, um die Verarbeitung zu beginnen geschieht, um sicherzustellen, wenn ein Browser nicht benutzen, es wird hoffentlich die andere Methode verwenden.
  2. Sie werden mit der Bearbeitung url und Abfragezeichenfolgeflag anpassen ersetzen.
  3. Ein Nachteil dieser Methode ist, dass, wenn der Benutzer den Browser zurück Taste trifft, wird sie zurück auf die „Bitte warten“ Seite aus der „Prozess“ Seite gehen, was bedeutet, es wird versehentlich wieder den Job beginnen. Ich werde diese Herausforderung für ein anderes Thema verlassen!

Beachten Sie auch, dass, wenn Ihr IIS-Server die Ausgabe mit gzip komprimiert, dann wird es scheinen alle Response.Flush Anrufe zu ignorieren.

Dies ist standardmäßig in IIS7 und auf Windows 7 eingeschaltet.

Und wenn Sie mit Fiddler testen, müssen Sie auf „Streaming“ -Modus aktivieren, oder Fiddler die gespülten HTML sammeln und zu halten, bis die Verbindung hergestellt ist.

Wenn Sie anrufen Response.Flush (), bevor die Reaktion abgeschlossen ist (vor dem Content-Length bekannt ist), erzeugt die ASP.NET-Laufzeit eine segmentierte kodierenden Teilantwort. Es liegt an den Browser, um zu entscheiden, wie das zu machen. In meinen Tests habe ich festgestellt, dass Browser Bilder zu machen neigen (<img> Tags), die in einem Teilantwort enthalten sind. Vielleicht haben Sie geben, dass ein Versuch.

Seien Sie jedoch vorsichtig über </html> zu früh zu senden; Browser kann etwas über diesen Punkt ignorieren. Browser machen Teilseiten des ganze Zeit, aber -., So dass Sie mit dem Anfang Ihrer Seite wie gewohnt beginnen

Im Fall ist es hilfreich, gehe ich durch ein Beispiel hierfür im Detail in meinem Buch, darunter ein Paket Spur, die genau zeigt, was auf dem Draht geschieht: ultra-Fast ASP.NET .

Ich denke, Browser und den Inhalt auf seiner Länge auf Basis verwenden, so können Sie padding 1000 Zeichen oder so versuchen. Zum Beispiel:

string myVeryShortMessage = "Processing ...";

Response.Write (myVeryShortMessage.PadRight (1000)); Response.Flush ();

System.Threading.Thread.Sleep (5000);

Response.Write ( "Finish" .PadRight (1000)); Response.Flush ();

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top