2012-05-15 4 views
6

Die Benutzer unserer Anwendung herunterladen einen Anhang mindestens einmal in zwei Sekunden während des Tages.Response.End() vs HttpContext.Current.ApplicationInstance.CompleteRequest()

Zurück Szenario:

Wir Response.End wurden mit(), um die Verbindung zum Client abzubrechen, nachdem der Benutzer eine Anlage herunterlädt. Da wir Leistungsprobleme hatten, begannen wir, Ausnahmen zu protokollieren, und eine der am häufigsten wiederholten war die Thread-Abbruch-Ausnahme. Da wir den Anhang von einem Web-Service bekommen, müssen wir etwas aufräumen und wir haben die Aufräumarbeiten in Try-Catch-Finally Block. Nach einigen Nachforschungen habe ich verstanden, dass jeder Code nach Response.End() nicht ausgeführt wird, selbst wenn er sich in Blockade befindet. Ist das richtig?

Aktuelles Szenario:

Ich habe den Faden in Stapelüberlauf über Response.End() lesen ist schädlich, und es muss nur verwendet werden, wenn es wirklich notwendig ist, so entschied ich mich Httpcontext zu verwenden ... .CompleteRequest() stattdessen. Mit diesem Code wird die erforderliche Bereinigung durchgeführt, aber das HTML, das gerendert wird, wird an den heruntergeladenen Anhang angehängt. Ich habe versucht, Render und RaisePostBackEvent, die im selben Artikel vorgeschlagen wurden, zu übergehen, aber das Problem besteht immer noch. Jede Idee, wie dieses Problem gelöst werden könnte, wäre hilfreich.

Code:

HttpContext.Current.Response.Clear(); 

Response.ClearContent(); 

Response.ClearHeaders(); 

Response.AddHeader("Content-Disposition", "attachment; filename=" + 
filename); 
Response.AddHeader("Content-Length", fileContent.Length.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.BinaryWrite(fileContent); 
Response.Flush(); 
+0

Bitte prägen Sie Ihre Titel nicht mit "C#" und so weiter. Dafür sind die Tags da. –

+1

Sicher. Das tut mir leid. Ich habe gerade angefangen, hier zu posten. Ich werde darauf achten, das nicht zu wiederholen. – user1396468

Antwort

5

Response.End intern führt die ThreadAbortException die Anforderung zu töten - wenn Sie irgendeine Art von Bereinigungs müssen tun, das muss vor der Aufruf an Response.End erfolgen wird.

Response.Redirect und Response.End nicht gut interagieren mit Try/Catch-Blöcke. In Ihrer Situation sollten Sie also alle Ihre Logik in den Antwort-Stream in Ihrem Versuch/fangen schreiben, dann rufen Sie einfach Response.End nach Ihrem endgültigen Block.

+0

Danke für die Antwort. Ich verstehe, dass das funktioniert, aber wie kann ich die ThreadAbortException loswerden, meine Log-Dateien auffüllen und wahrscheinlich auch etwas Speicher auf dem Server haben. Gibt es eine Möglichkeit, dies ohne Response.End() zu tun. edit: Wenn ich Response.End() nach meinem finally-Block benutze, liefere ich das gleiche Problem, wenn gerendertes HTML an das heruntergeladene Dokument angehängt wird. Jedenfalls kann ich das lösen. Danke für die Antwort noch einmal. – user1396468

+0

Beenden Sie das Umhüllen der Antwort.End in Ihrem Versuch/fangen. 'Response.End' verwendet die' ThreadAbortException', um die Antwort zu beenden. So funktioniert es. Sie fangen im Grunde die Ausnahme des Rahmens ein. – Tejs

+0

Ok. Ich werde Response.End() nicht in einen Versuch einpacken .. Fang. Danke, dass du darauf hingewiesen hast. kannst du auf meine bearbeitung antworten, ich habe gerade den code, den du vorgeschlagen hast, ausprobiert, und ich habe das html-problem erneut. Ich schätze deine Antworten sehr. Danke. – user1396468

0

Alte Q, und nicht sicher, ob es hilft, aber ich mache im Wesentlichen das gleiche wie Ihr Beispiel beim Erstellen von PDF-Dateien an den Browser zu liefern. Jedoch am Ende der Verarbeitung, habe ich folgende:

Response.OutputStream.Flush() 
    Response.OutputStream.Close() 
    Response.End() 

Die Zugabe von .Close() im Grunde genommen. Scheint in der Produktion gut zu funktionieren.

Ed: gefunden Gerade dies auch zu erwähnen Close(): Is Response.End() considered harmful?

Ein weiterer Ansatz, um Ihr Problem einfach überschreibt Page_PreRender() und den Content-Delivery-Code setzt dort (die Art des funktionellen Sinn macht). Dann werden Sie definitiv kein unerwünschtes HTML bekommen, und Response.End() sollte überhaupt nicht nötig sein.

Verwandte Themen