HttpContext выдает HttpException - PullRequest
       41

HttpContext выдает HttpException

20 голосов
/ 04 апреля 2011

Я написал собственный обработчик 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);
}

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

Ответы [ 7 ]

14 голосов
/ 25 мая 2011

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

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

8 голосов
/ 07 марта 2012

У меня были похожие проблемы, я получил эту статью, в которой объясняется, что Response.End () следует избегать, а вместо этого предлагает использовать метод 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

4 голосов
/ 04 апреля 2011

Используйте 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();
        }
    }
}
2 голосов
/ 04 апреля 2011

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

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

0x800703E3 "The I/O operation has been aborted because of either a thread exit or an application request."
1 голос
/ 10 января 2012

Для получения более подробной информации об этом исключении посетите http://support.microsoft.com/kb/977453

1 голос
/ 04 апреля 2011

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

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

попытатьсячасто повторять пулы приложений на iis.

0 голосов
/ 22 мая 2018

У меня иногда возникает ошибка:

Exception message: An error occurred while communicating with the remote host. The error code is 0x80070057.

является случайным в производстве. Его нельзя воспроизвести в разработке или QA.

Я буду применять это решение: Response.IsClientConnected Я надеюсь, что это исправит ошибку.

Источник:

https://stackoverflow.com/a/11441375/1536197

...