Почему мое приложение asp.net выдает исключение ThreadAbortException?

StackOverflow https://stackoverflow.com/questions/12476

  •  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, вы хотите, чтобы перенаправление произошло немедленно.Посмотрите это для получения дополнительной информации:

Response.Redirect и исключение ThreadAbortException

Зная, что существует (как минимум) три 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top