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

Почему приложение asp.net бросает ThreadAbortException?

сам объяснительный вопрос.

Почему эта вещь бросается в мою попытку поймать, даже если ничего не случилось?

Почему он появляется в моем журнале сотни раз?

Я знаю его вопрос newb, но если этот сайт будет получать ранжирование поиска и рисовать в newbs, мы должны спросить их

4b9b3361

Ответ 1

Вероятно, это происходит из ответа Response.Redirect. Проверьте эту ссылку для объяснения:

http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx

(В большинстве случаев вызов Response.Redirect(url, false) устраняет проблему)

Ответ 2

Наиболее распространенной причиной исключения ThreadAbortException является вызов Response.End, Response.Redirect или Server.Transfer. Microsoft опубликовала некоторые предлагаемые функции, которые следует использовать вместо этих функций.

Ответ 3

Как говорили другие, это происходит, когда вы вызываете Response.End() (что происходит, когда вы вызываете Response.Redirect, не передавая false как второй параметр). Это работает так, как было разработано; обычно, если вы вызываете Response.Redirect, вы хотите, чтобы перенаправление выполнялось немедленно. См. Это для получения дополнительной информации:

Response.Redirect и ThreadAbortException

Ответ 4

Зная, что существуют (по крайней мере) три API, которые используют Thread.Abort для внутреннего использования, я хотел бы ответить более практично, как решить, что с этим делать.

Для нас эта ошибка начала регистрироваться в любой момент. Что изменилось? Мы исправили ошибку в некоторой процедуре базы данных, которая касалась файлов Sitemap.

Журналы log4net показали, что заголовок X-Forwarded-For (мы отстаем от NLB) - это IP-адрес Googlebot, 66.249.78.x, который подкрепляет мою теорию изменения сайта, приводя к тому, что Google просматривает наш сайт более активно изображения.

Первое, что нужно было выяснить, почему только робот Googlebot смог вызвать эту проблему. Ни один другой клиент не запускал любой путь кода, использующий Response.Redirect, или что-то еще.

Итак, в обработчике HttpApplication.Error я добавил некоторый код для записи дополнительного подробного вывода со всеми заголовками, а большинство данных в HttpResponse и HttpContext извергалось для журнала.

Это позволяет мне видеть, что проблема заключается в том, что Googlebot использует строку пользовательского агента iPhone и вооружился этим, я смог выполнить поиск в базе кода для "iPhone" и придумал:

private void CheckIPhoneAccess() { ... }

И это использует перенаправление.

Что с этим делать?

Ну, для этой устаревшей кодовой базы не стоит ретро-исправлять все вызовы Response.Redirect, поэтому я собираюсь снизить уровень ведения журнала для ThreadAbortException для приложения.

Я изменю поведение для мобильного робота Googlebot, что не приведет к "ложью" о том, что наш сайт обслуживает мобильным телефонам, поскольку он перенаправляет только на первый хит, затем он считывает файл cookie и показывает изображение. Googlebot, похоже, не кэширует этот файл cookie.

Это не идеально, но сайт должен быть перестроен. вероятно, другой командой, использующей Scala или что-то в этом роде, поэтому, на практике, я считаю, что это хороший выбор. Я добавлю комментарии и позже могу вернуться к проблеме, постройте расширение Response.SafeRedirect, которое инкапсулирует этот совет:

Почему Response.Redirect вызывает System.Threading.ThreadAbortException?

Лука

Ответ 5

Причина того, почему Response.Redirect предоставит это исключение, - это asp.net внутренне реализовать этот API с помощью Thread.Abort(). Когда этот метод вызывается, генерируется специальное исключение ThreadAbortException. Это исключение не будет проглочено никаким блоком catch. Он будет сброшен в конце каждого блока catch.