2009-04-10 9 views
5

Zuerst versuchte ich herauszufinden, was der Unterschied zwischen Response.Close und Response.End ist, aber nach mehr googeln und Forschung, ist es klar, dass ich nicht eine gemeinsame gesehen habe So wird ein Byte [] zurück an den Client gesendet. Ich werde das Codebeispiel unten lassen, aber ich würde gerne wissen, was der Industriestandard dafür ist.ASP.NET Wie man Datei zum Benutzer streamen

Byte[] myBytes = GetReportBytes(); 
HttpContext.Current.Response.ClearContent(); 
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString()); 
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension()); 
HttpContext.Current.Response.ContentType = GetApplicationContentType(); 
HttpContext.Current.Response.BinaryWrite(myBytes); 
HttpContext.Current.Response.Flush(); 
HttpContext.Current.Response.Close(); 
//CERT FIX 
//HttpContext.Current.Response.End(); 

Antwort

15

würde ich Response.Close() oder Response.End() nicht nennen.

Response.End() stoppt die Seite Ausführung/Rendering an diesem Punkt. Kein Code nach Response.End() wird ausgeführt. Die Antwort wird an diesem Punkt beendet, ohne dass dem Stream weitere Ausgaben hinzugefügt werden.

Response.Close() ist vergleichbar mit Response.End(), ermöglicht aber, dass Code nach dem Aufruf ausgeführt wird (es kann jedoch keine weitere Ausgabe in der Seitenantwort gesendet werden).

Response.Flush() sendet alle verbleibenden Antwortelemente auf die Seite.

Aus IIS core team member:

Response.Close sendet ein Rücksetzpaket an den Client und deren Verwendung in etwas andere als Fehlerzustand wird zu allen möglichen Problemen führen - zum Beispiel, wenn Sie sind im Gespräch mit einem Client mit genug Latenz, das Reset-Paket kann dazu führen, andere Antwortdaten auf gepuffert der Server, Client oder irgendwo in zwischen fallen gelassen werden.

In diesem speziellen Fall Kompression beinhaltet für gemeinsame Muster in der Reaktion und eine gewisse Menge an Antwort der Suche durch die Komprimierungscode gepuffert werden, um die Chance auf mehr sich wiederholende Muster zu erhöhen - dieses Teil, ist gepuffert kann nicht an den Client gesendet werden, sobald Sie Response.Close() tun.

Kurz gesagt, verwenden Sie nicht Response.Close().

+0

Danke für die Info ... – RSolberg

+0

@Mitch - Ich ändere die Frage ein bisschen für mehr wie man im Allgemeinen streamen. Ich sehe keinen Standard dafür und würde gerne dort anfangen. – RSolberg

+3

Also nicht Response.Close() oder Response.End() beim Streaming einer Datei aufrufen? Rufen Sie einfach Response.Flush() auf, um die Datei aus dem Puffer zu senden und die Methode zu beenden. – StuperUser

Verwandte Themen