Почему мое приложение asp.net выдает исключение ThreadAbortException?
-
08-06-2019 - |
Вопрос
само собой разумеющийся вопрос.
Почему эта штука всплывает в мою попытку, даже если все в порядке?
Почему это появляется в моем журнале сотни раз?
Я знаю, что это вопрос для новичков, но если этот сайт хочет получить рейтинг в поисковых системах и привлечь новичков, мы должны задать им вопрос.
Решение
Вероятно, это происходит из-за вызова Response.Redirect.Проверьте эту ссылку для объяснения:
http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx
(В большинстве случаев вызов Response.Redirect(url, false) решает проблему)
Другие советы
Наиболее распространенной причиной возникновения ThreadAbortException является вызов Response.End, Response.Redirect или Server.Transfer.Microsoft опубликовала некоторые рекомендуемые функции, которые следует использовать вместо этих функций.
Как говорили другие, это происходит, когда вы вызываете Response.End() (что происходит, когда вы вызываете Response.Redirect без передачи false в качестве второго параметра).Это работает так, как задумано;обычно, если вы вызываете Response.Redirect, вы хотите, чтобы перенаправление произошло немедленно.Посмотрите это для получения дополнительной информации:
Зная, что существует (как минимум) три 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?
Люк
Причина, по которой Response.Redirect выдает это исключение, заключается в том, что asp.net внутренне реализует этот API с помощью Thread.Abort().При вызове этого метода генерируется специальное исключение ThreadAbortException. Это исключение не будет проглочено каким-либо блоком catch.Он будет переброшен в конце каждого блока catch.