Response.Flush() throws System.Web.HttpException

11

I have a HttpHandler that I'm using to handle certain images on a client's website. When I'm outputting the image stream to the response object and call Flush occasionally an error is thrown. Here is a codeblock


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();

From what I've read, this exception is caused by a client disconnecting before the process has completed and there is nothing to flush.

Here is an output of my error page


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 falls at line 75.

Is there a way to check this before performing the flush without wrapping it in a try/catch block.?

c#
asp.net
image
httphandler
asked on Stack Overflow Oct 12, 2009 by Anthony Shaw

4 Answers

11

Personally in your implementation since the next line is Response.End(), just remove the call to Response.Flush() as Response.End() takes care of everything for you.

answered on Stack Overflow Oct 12, 2009 by Mitchel Sellers
7

While I agree with Mitchel - there's little need to call flush as you're about to call End, if you're using this elsewhere, you could try calling Response.IsClientConnnected first.

Gets a value indicating whether the client is still connected to the server.

answered on Stack Overflow Oct 12, 2009 by Zhaph - Ben Duguid • edited May 23, 2017 by Community
0

I realise this is an old post but it came up when I was looking for an answer to a similar issue. The following is largely verbatim from this SO answer. More background info is available at Is Response.End() considered harmful?.

Replace this: HttpContext.Current.Response.End();

With this:

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.
answered on Stack Overflow Oct 7, 2015 by David Clarke • edited May 23, 2017 by Community
0

For future readers..

I ran into this case where Response.End() throws an error because the client is disconnected.

An error occurred while communicating with the remote host. The error code is 0x80070057

Oddly a CRLF in the StatusDescription was causing the connection to close.

Response.StatusDescription = ex.Message;

Cannot insert the value NULL into column '', table ''; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated

Removing it fixed my problem.

Response.StatusDescription = ex.Message.Replace("\r\n", " ");
answered on Stack Overflow May 30, 2018 by Garfield

User contributions licensed under CC BY-SA 3.0