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