Response.Flush() выдает System.Web.HttpException

У меня есть HttpHandler, который я использую для обработки определенных изображений на клиентском веб-сайте. Когда я выводя поток изображения в объект ответа и иногда вызываю Flush, возникает ошибка. Вот кодовый блок


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

Из того, что я прочитал, это исключение вызвано отключением клиента до того, как процесс завершился, и нечего смывать.

Вот результат моей страницы ошибок


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 попадает в строку 75.

Есть ли способ проверить это перед выполнением флеша, не обернув его в блок try/catch.?

Ответ 1

Пока я согласен с Mitchel - вам не нужно вызывать флеш, поскольку вы собираетесь вызвать End, если вы используете это в другом месте, вы можете попробовать позвонить Response.IsClientConnnected.

Получает значение, указывающее, все еще подключен клиент к серверу.

Ответ 2

Лично в вашей реализации, так как следующая строка - Response.End(), просто удалите вызов Response.Flush() как Response.End() заботится обо всем для вас.

Ответ 3

Я понимаю, что это старый пост, но он появился, когда я искал ответ на подобную проблему. В значительной степени это дословно из этого SO-ответа. Дополнительная информация доступна на Является ли Response.End() считающейся вредной?.

Замените это: HttpContext.Current.Response.End();

При этом:

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.