2016-07-22 6 views
10

Wir hatten ein Problem vor kurzem, wo einer der Entwickler von einer Zeile Code geändert hatte mit HttpResponse.EndHttpApplication.CompleteRequest zu verwenden, wenn eine PDF-Zwingen in ähnlicher Weise wie die folgenden zum Download: https://stackoverflow.com/a/8590579/3856039Verwendung von Response.End wenn zwingen PDF Download

Dies führte dazu, dass einige PDFs aufgrund eines fehlerfreien Platzproblems nicht heruntergeladen werden konnten. Daher wurde der Code wieder auf HttpResponse.End zurückgesetzt.

jedoch meinem Kollegen zu helfen, war ich einige der Forschung durchgeführt und stieß ich auf die folgende Frage: Is Response.End() considered harmful?

, zu denen Links: https://blogs.msdn.microsoft.com/aspnetue/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation/

Anbetracht dessen, was in der MSDN-Blog-Post dokumentiert ist, es klingt wie HttpResponse.End zu verwenden ist der falsche Ansatz, also habe ich mich gefragt, ob es überhaupt benötigt wird oder ob es einen besseren Ansatz gibt?

+0

Wenn Sie einen Grund haben, die Anfrage manuell zu beenden, dann ist CompleteRequest die zu verwendende Sache, wenn dies an anderer Stelle ein Problem verursacht, dann sollten Sie dies angehen und beheben. Sie müssen nichts aufrufen, wenn Ihre Anwendung nach dem Schreiben der Antwort auf natürliche Weise zu ihrem Einstiegspunkt zurückfährt. –

+0

Haben Sie versucht, die Datei als Bytearray zu lesen und als FileResult zurückzugeben? Es reagiert nicht auf Ihre Frage, aber es könnte eine Problemumgehung sein. –

+0

Ich denke, der MSDN-Link, den Sie enthalten, hat die Antwort, die Sie suchen: "Die End-Methode gibt es nur, weil wir versucht haben, mit klassischem ASP kompatibel zu sein, als 1.0 veröffentlicht wurde." Es wird dann darauf hingewiesen, dass dies nicht empfohlen wird, da es den Inhalt synchron spült, während die Daten asynchron gesendet werden, wenn die Anforderung auf die übliche Weise endet. "In der Dokumentation für End sollte angegeben werden, dass CompleteRequest eine bessere Möglichkeit bietet, die EndRequest-Benachrichtigung zu überspringen und die Anfrage abzuschließen." –

Antwort

0

Hier ist der Ansatz, die ich in der Vergangenheit

// Sends all currently buffered output 
HttpContext.Current.Response.Flush(); to the client. 

// Gets or sets a value indicating whether to send HTTP content to the client. 
HttpContext.Current.Response.SuppressContent = true; 

/* Causes ASP.NET to bypass all events and filtering in the HTTP pipeline 
    chain of execution and directly execute the EndRequest event. */ 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
1

Hier ist der eigentliche Code ist aus Response.End verwendet haben:

public void End() 
{ 
    if (this._context.IsInCancellablePeriod) 
    { 
     HttpResponse.AbortCurrentThread(); 
     return; 
    } 
    this._endRequiresObservation = true; 
    if (!this._flushing) 
    { 
     this.Flush(); 
     this._ended = true; 
     if (this._context.ApplicationInstance != null) 
     { 
      this._context.ApplicationInstance.CompleteRequest(); 
     } 
    } 
} 

Die ThreadAbortException verwendet wird zur Steuerung von flow-- grundsätzlich Sie ermöglicht zu Verwenden Sie Response.End anstelle von return. Aber wenn Sie Ihren Handler gut entworfen haben, brauchen Sie ihn vielleicht nicht, z. wenn nach Response.End() kein Code vorhanden ist. Es ist im Allgemeinen besser, die Ausnahme nicht zu werfen, wenn Sie sie vermeiden können, da sie (wie alle Ausnahmen) zu einem Stapelabbau und einem gewissen Leistungsaufwand führt.

Vielleicht können Sie Ihre eigene Version von Response.End schreiben und auswählen und auswählen, welche Codezeilen tatsächlich ausgeführt werden, z. Vielleicht möchten Sie den Puffer leeren und CompleteRequest aufrufen, aber Sie wollen nicht die Ausnahme auslösen.