Подтвердить что ты не робот

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);
}

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

4b9b3361

Ответ 1

Вызовите вызов Flush() и Close(). Вы им действительно не нужны. Как только ваш обработчик будет завершен, он выйдет, и ASP.NET обработает закрытие запроса.

Кроме того, Flush() следует использовать при потоковой передаче содержимого клиенту (добавление частей в поток ответов в блоках). Вам не нужно использовать его с помощью TransmitFile().

Ответ 2

Я столкнулся с подобными проблемами, получил эту статью, в которой объясняется, что Response.End() следует избегать ed и вместо этого предлагает использовать метод CompleteRequest(). Эта информация также была обновлена ​​в документации MSDN. Надеюсь, это поможет кому-то.

http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx

Ответ 3

Используйте Response.End() вместо Response.Flush()

Вот как выглядит исходный код для Response.End():

public void End()
{
    if (this._context.IsInCancellablePeriod)
    {
        InternalSecurityPermissions.ControlThread.Assert();
        Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
    }
    else if (!this._flushing)
    {
        this.Flush();
        this._ended = true;
        if (this._context.ApplicationInstance != null)
        {
            this._context.ApplicationInstance.CompleteRequest();
        }
    }
}

Ответ 4

Какую платформу .NET вы используете? Эта тема форума здесь описывает аналогичную проблему с использованием IIS7 с .NET2.0 специально для устранения клиента, проблема, которая была рассмотрена в .NET. рамки 3.5

Фактический код ошибки отображается на

0x800703E3 "The I/O operation has been aborted because of either a thread exit or an application request."

Ответ 5

попытайтесь настроить файл максимального размера в веб-конфигурации на более крупный.

Вы можете установить maxRequestLength (в kb)

попробуйте также не добавлять реплики приложений на iis.