Я написал собственный обработчик 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);
}
Но это не имело никакого значения. Причина, хотя я предполагаю, в том, что клиент отключился во время загрузки, а не до того, как был вызван сброс.