2009-10-12 13 views
10

Ich habe einen HttpHandler, den ich verwende, um bestimmte Bilder auf der Website eines Kunden zu behandeln. Wenn ich den Bildstrom an das Antwortobjekt ausgabe und Flush gelegentlich anrufe, wird ein Fehler ausgelöst. Hier ist ein CodeblockResponse.Flush() löst System.Web.HttpException aus


var image = Image.FromStream(memStream); 
if (size > -1) image = ImageResize.ResizeImage(image, size, size, false); 
if (height > -1) image = ImageResize.Crop(image, size, height, ImageResize.AnchorPosition.Center); 

context.Response.Clear(); 
context.Response.ContentType = contentType; 
context.Response.BufferOutput = true; 

image.Save(context.Response.OutputStream, ImageFormat.Jpeg); 

context.Response.Flush(); 
context.Response.End(); 

Von dem, was ich gelesen habe, ist diese Ausnahme von einem Client Trennen verursacht, bevor der Prozess abgeschlossen ist, und es gibt nichts zu spülen.

ist hier eine Ausgabe meiner Fehlerseite


System.Web.HttpException: An error occurred while communicating with the remote host. The error code is 0x80070057. 
Generated: Mon, 12 Oct 2009 03:18:24 GMT 

System.Web.HttpException: An error occurred while communicating with the remote host. The error code is 0x80070057. 
    at System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.FlushCore(Byte[] status, Byte[] header, Int32 keepConnected, Int32 totalBodySize, Int32 numBodyFragments, IntPtr[] bodyFragments, Int32[] bodyFragmentLengths, Int32 doneWithSession, Int32 finalStatus, Boolean& async) 
    at System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse(Boolean isFinal) 
    at System.Web.Hosting.ISAPIWorkerRequest.FlushResponse(Boolean finalFlush) 
    at System.Web.HttpResponse.Flush(Boolean finalFlush) 
    at System.Web.HttpResponse.Flush() 
    at PineBluff.Core.ImageHandler.ProcessRequest(HttpContext context) in c:\TeamCity\buildAgent\work\79b3c57a060ff42d\src\PineBluff.Core\ImageHandler.cs:line 75 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

context.Response.Flush fällt in Zeile 75.

Gibt es eine Möglichkeit, dies zu überprüfen, bevor ohne den Flush Durchführung es in einem Versuch Einwickeln/Fangblock.

Antwort

6

Während ich mit Mitchel zustimme - es gibt wenig Notwendigkeit, flush aufzurufen, wie Sie End anrufen werden, wenn Sie dies an anderer Stelle verwenden, können Sie versuchen, Response.IsClientConnnected zuerst aufrufen.

Ruft einen Wert ab, der angibt, ob der Client noch mit dem Server verbunden ist.

+0

so konnte ich meine .Flush() und .End() in einer .IsClientConnected wickeln und dass mein Problem automatisch beheben denken Sie? Die Kunden des Kunden erhalten den Fehler nicht auf ihren Bildschirmen, ich bekomme jedes Mal E-Mails von ELMAH. Nur ein kleiner Ärger mehr als alles andere. –

+0

Sie könnten den .Flush in die Prüfung einpacken - nicht zu sicher über irgendwelche Auswirkungen des Nicht-Aufrufs .End ... Ich nehme an, es gibt einen lang andauernden Prozess, der dazu führt, dass Leute die Verbindung trennen, bevor Sie das Bild fertig haben. –

+0

Ich kann bestätigen, dass das Wrapping innerhalb einer .IsClientConnected die gleiche Ausnahme auslösen kann; ist mir gerade passiert. Bleiben Sie bei .End() – Contra

11

Persönlich in Ihrer Implementierung seit der nächsten Zeile ist Response.End(), entfernen Sie einfach den Aufruf von Response.Flush() als Response.End() kümmert sich um alles für Sie.

0

Ich weiß, das ist ein alter Beitrag, aber es kam, als ich nach einer Antwort auf ein ähnliches Problem suchte. Das Folgende ist weitgehend wörtlich aus this SO answer. Weitere Hintergrundinformationen finden Sie unter Is Response.End() considered harmful?.

diese ersetzen: HttpContext.Current.Response.End();

mit diesem:

HttpContext.Current.Response.SuppressContent = true; // Gets or sets a value indicating whether to send HTTP content to the client. 
HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event. 
Verwandte Themen