Зная, что есть (по крайней мере) три API-интерфейса, которые внутренне используют Thread.Abort
, я хотел бы ответить более практично, как решить, что с этим делать.
Для нас эта ошибка стала регистрироваться внезапно. Что изменилось? Мы исправили ошибку в некоторой процедуре базы данных, которая имела дело с картами сайта.
В журналах log4net показывалось, что заголовок X-Forwarded-For (мы за NLB) был IP-адресом Googlebot, 66.249.78.x, что укрепило мою теорию об изменении карты сайта, которая привела к тому, что Google сканировал наш сайт более агрессивно, ища изображения.
Первым делом выяснилось, почему только робот Google мог вызвать эту проблему. Ни один другой клиент не запускал какой-либо путь кода, использующий Response.Redirect
, или любой другой.
Итак, в обработчике HttpApplication.Error
я добавил некоторый код для регистрации дополнительных подробных выходных данных со всеми заголовками, и большая часть данных в HttpResponse
и HttpContext
выбрасывалась в журнал.
Это позволило мне увидеть, что проблема заключалась в том, что робот Googlebot использует строку агента пользователя iPhone и, вооружившись этим, я смог найти в кодовой базе "iPhone" и найти:
private void CheckIPhoneAccess() { ... }
И это использует Redirect.
Что с этим делать?
Ну, для этой устаревшей кодовой базы не стоит ретро-патчировать все вызовы Response.Redirect
, поэтому я собираюсь понизить уровень ведения журнала для ThreadAbortException
для приложения.
Я изменю поведение сканера Googlebot для мобильных устройств, которое не приведет к «лжи» в отношении того, что наш сайт обслуживает мобильные устройства, поскольку он перенаправляет только при первом обращении, впоследствии читает файл cookie и показывает изображение. Похоже, робот Google не кэширует этот файл cookie.
Это не идеально, но сайт должен быть перестроен. вероятно, другой командой, использующей Scala или что-то еще, так что с практической точки зрения, я думаю, что это хороший выбор. Я добавлю комментарии и, возможно, вернусь к этой проблеме позже, создаю расширение Response.SafeRedirect
, которое включает этот совет:
Почему Response.Redirect вызывает исключение System.Threading.ThreadAbortException?
Люк