Принятый способ предотвращения исключения «Удаленный узел закрыл соединение» - PullRequest
9 голосов
/ 15 апреля 2011

Я постоянно получаю следующее исключение, которое вызвано тем, что пользователь инициирует загрузку и, следовательно, не может (или отменяется):

Сообщение об ошибке: удаленный хост закрыт связь. Код ошибки 0x80072746. Трассировка стека: в System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.FlushCore (байт [] статус, байт [] заголовок, Int32 keepConnected, Int32 totalBodySize, Int32 numBodyFragments, IntPtr [] bodyFragments, Int32 [] bodyFragmentLengths, Int32 doneWithSession, Int32 finalStatus, Boolean & async) в System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse (Boolean isFinal) в System.Web.Hosting.ISAPIWorkerRequest.FlushResponse (Boolean finalFlush) на

Я искал по всему Интернету и нашел интересную статью , однако, похоже, нет однозначного ответа, как лучший способ предотвратить заполнение журналов.

Пользователь не видит ошибок, и в приложении нет реальной проблемы, поскольку она возникает (в моем понимании) только в ситуациях, не зависящих от него (пользователь отменяет загрузку или потеряет соединение), но должен быть способ предотвратить такое сообщается об исключении.

Мне неприятно это говорить, но я испытываю желание проверить это исключение, и пустой catch блокирует его задницу - но это заставляет меня чувствовать себя грязным программистом.

Итак - Каков принятый метод предотвращения заполнения этого почтового ящика этим исключением?

Ответы [ 3 ]

8 голосов
/ 10 апреля 2014

Ошибка возникает при попытке отправить ответ клиенту, но он отключился.Вы можете проверить это, установив точку останова в Response.Redirect или куда бы вы ни отправляли данные клиенту, подождите, пока Visual Studio достигнет точки останова, а затем отмените запрос в IE (используя x в строке адреса).Это должно привести к возникновению ошибки.

Чтобы зафиксировать ошибку, вы можете использовать следующее:

try
{
    Response.Redirect("~/SomePage.aspx");
    Response.End();
}
catch (System.Threading.ThreadAbortException)
{
    // Do nothing. This will happen normally after the redirect.
}
catch (System.Web.HttpException ex)
{
    if (ex.ErrorCode == unchecked((int)0x80070057)) //Error Code = -2147024809
    {
        // Do nothing. This will happen if browser closes connection.
    }
    else
    {
        throw ex;
    }
}

Или в C # 6 вы можете использовать фильтры исключений, чтобы предотвратить повторную ошибку:

try
{
    Response.Redirect("~/SomePage.aspx");
    Response.End();
}
catch (System.Threading.ThreadAbortException)
{
    // Do nothing. This will happen normally after the redirect.
}
catch (System.Web.HttpException ex) when (ex.ErrorCode == unchecked((int)0x80070057))
{
    // Do nothing. This will happen if browser closes connection.
}

Это лучший способ отладки, так как он остановится на операторе, генерирующем исключение с текущим состоянием и всеми локальными переменными, сохраненными вместо команды на выброс внутри блока catch.

3 голосов
/ 15 апреля 2011

Вы не можете запретить удаленному хосту что-либо закрывать.

И в некоторых протоколах это нормальный (или, по крайней мере, принятый) способ попрощаться.

Так что вам придется обработать это специфическое исключение.

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

С практической точки зрения нет ничего плохого в том, чтобы отменить загрузку из-за мертвого компьютера или из-за прерванного веб-сеанса, поэтому перехват закрытых исключений удаленного хоста вполне приемлем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...