Сведения о вопросе

Pytdev

13:10, 13th August, 2020

Теги

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

Просмотров: 454   Ответов: 5

само собой разумеющийся вопрос.

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

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

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



  Сведения об ответе

ASSembler

22:29, 2nd August, 2020

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

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

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


  Сведения об ответе

darknet

09:55, 28th August, 2020

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


  Сведения об ответе

padenie

18:51, 29th August, 2020

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

Response.Redirect и ThreadAbortException


  Сведения об ответе

darknet

18:50, 23rd August, 2020

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

Для нас эта ошибка начала регистрироваться all-of-a-sudden. Что же изменилось? Мы исправили ошибку в какой-то процедуре базы данных, которая имела дело с картами сайтов.

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

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

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

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

private void CheckIPhoneAccess() { ... }

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

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

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

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

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

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

Лука


  Сведения об ответе

padenie

11:14, 15th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться