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