HttpContext выдает исключение HttpException

Я написал собственный обработчик http. Я сделал это, написав класс, который реализует IHttphandler.

Внутри этого класса у меня есть код вроде этого,

context.Response.Clear();
context.Response.ClearHeaders();
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + attachmentFileName);
context.Response.AddHeader("Content-Length", new FileInfo(downloadFile).Length.ToString());
context.Response.ContentType = GetMimeType(attachmentFileName);
context.Response.TransmitFile(downloadFile);
context.Response.Flush();
context.Response.Close();

Иногда я получаю такую ​​ошибку,

Exception HttpException The remote host closed the connection The error code is 0x800703E3

Или это,

Exception HttpException The remote host closed the connection The error code is 0x80070040

В обоих случаях стек трассировка:

at System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect)
at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
at System.Web.HttpResponse.Flush(Boolean finalFlush)
at System.Web.HttpResponse.Flush()

Это происходит в производственной среде, и, если я оглянусь назад за последние несколько дней, ошибки произошли 23 раза, и в целом приведенный выше код был вызван 497 раз.

Я подозреваю, что эта ошибка связана с Пользователь нажимает ссылку, чтобы запустить приведенный выше код более одного раза (что даст ему несколько диалоговых окон загрузки), а затем отменяет некоторые из них. Сказав это, если бы это было что-то вроде этого, я ожидал бы, что соединение будет корректно закрыто на обоих концах.

Как я могу доказать точную причину этой ошибки? Я пробовал включить. NET, как это Почему прослушиватели трассировки не регистрируют трафик пользовательского обработчика? , но не могут заставить его работать.

Однако я обнаружил, что я включил трассировку IIS для регистрации неудачных запросов. Сбой произошел снова, и НИЧЕГО не было в этом журнале.

Любую другую трассировку, которую я могу включить, например?

Следующее, что я попробовал, было это,

if (context.Response.IsClientConnected)
{
    context.Response.Flush();
    context.Response.Close();
}
else
{
    LogMessage("Client has disconnected before flush was called", Severity.Information);
}

Но это не имело никакого значения. Причина, хотя я предполагаю, в том, что клиент отключился во время загрузки, а не до того, как был вызван сброс.

20
задан Community 23 May 2017 в 12:02
поделиться