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?


person Anthony Shaw    schedule 12.10.2009    source источник


Ответы (4)


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

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

person Zhaph - Ben Duguid    schedule 12.10.2009
comment
Итак, могу ли я обернуть свои .Flush() и .End() в .IsClientConnected и исправить мою проблему, как вы думаете? Клиенты клиента не получают сообщение об ошибке на своих экранах, я просто каждый раз получаю электронные письма от ELMAH. Просто небольшое раздражение больше, чем что-либо. - person Anthony Shaw; 12.10.2009
comment
Вы, конечно, могли бы обернуть .Flush в чек - не слишком уверен в каких-либо последствиях отказа от вызова .End ... Я предполагаю, что там есть какой-то длительный процесс, который заставляет людей отключаться до того, как вы закончили генерировать образ? - person Zhaph - Ben Duguid; 13.10.2009
comment
Я могу подтвердить, что обертывание flush внутри .IsClientConnected может вызвать такое же исключение; случилось со мной прямо сейчас. Придерживайтесь .End() - person Contra; 28.06.2011

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

person Mitchel Sellers    schedule 12.10.2009

Я понимаю, что это старый пост, но он появился, когда я искал ответ на аналогичную проблему. Следующее в значительной степени дословно взято из этого ответа 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.
person David Clarke    schedule 07.10.2015

Будущим читателям..

Я столкнулся с этим случаем, когда Response.End() выдает ошибку, потому что клиент отключен.

Произошла ошибка при обмене данными с удаленным хостом. Код ошибки 0x80070057.

Как ни странно, CRLF в StatusDescription приводил к закрытию соединения.

Response.StatusDescription = ex.Message;

Невозможно вставить значение NULL в столбец '', таблицу ''; столбец не допускает пустых значений. INSERT завершается ошибкой.\r\nВыполнение оператора завершено.

Удаление решило мою проблему.

Response.StatusDescription = ex.Message.Replace("\r\n", " ");
person Garfield    schedule 30.05.2018