it-roy-ru.com

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

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

20
peter

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

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

14
Samuel Neff

Я был в подобных проблемах, получил эту статью, которая объясняет, что 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

8
DotNetUser

Используйте 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
smartcaveman

Какой .NET Framework вы используете? В этой ветке форума здесь описывается аналогичная проблема с использованием 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."
2
Dan

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

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

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

1
jack.the.ripper

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

1
Sooraj

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

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

0
Hernaldo Gonzalez