Что может вызвать ThreadAbortException при использовании HttpWebRequest.GetResponse ()

Я живу в кошмарах из-за этой ситуации, у меня есть HttpWebRequest.GetResponse, который продолжает выдавать мне ThreadAbortException, из-за чего все приложение падает.

Как я могу избежать этого или, по крайней мере, справиться с этим, было бы полезно использовать Thread.ResetAbort () в таком случае?

Чтобы объяснить больше, вот примерный пример кода:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/");
HttpWebResponse resp = req.GetResponse();

теперь последняя строка выше вызывает исключение ThreadAbortException, это может быть связано с тем, что истекло время ожидания запроса, и это нормально, но я не хочу получать исключение ThreadAbortException внутри моего приложения ASP.NET 2.0, потому что оно его убивает. ThreadAborException нельзя отловить с помощью try / catch, единственный способ справиться с этим - использовать Thread.ResetAbort (), который тоже имеет свои плохие эффекты, он будет поддерживать поток, и бог знает, как долго.

Попробуйте перехватить System.Exception во второй строке и посмотреть, какой тип ex выбрасывается.

StingyJack 14.10.2008 22:19

Вы может поймаете ThreadAbortException, вам просто нужно обработать его правильно. ResetAbort () - это то, что нужно сделать, когда вы закончите. Подробнее см. msdn.microsoft.com/en-us/library/….

Bob King 15.10.2008 01:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
2
6 478
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

У меня возникла проблема с использованием Response. Прочтите эту статью, чтобы найти обходные пути. http://support.microsoft.com/kb/312629

Также ознакомьтесь с этой документацией MSDN в разделе WebException и примечаний. http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx

Это исключение может быть перехвачено ... Если у вас возникли проблемы с обнаружением нужного, вы должны попытаться перехватить общее исключение (system.Exception), и оттуда трассировка стека должна указать вам конкретный тип (HttpException, WebException и т. д.) Для собственно улов.

Наше приложение все время выбрасывало ThreadAbortException b / c из Response.Redirect ("url") звонки. Приложение никогда не закрывалось, скорее всего, потому что исключение было обнаружено в какой-то момент и оставалось активным.

Кстати, Response.Redirect ("url", false) предотвратит завершение ответа с исключением. В сообщении Эндрю есть ссылки на аналогичные обходные пути для различных применений класса Response.

Это верно (Response.Redirect (url) вызывает Response.End, который вызывает исключение ThreadAbortException), но не имеет отношения к ситуации OP.

Joe 15.10.2008 00:29

Я видел обе проблемы, перечисленные Эндрю и "ForCripesSake".

Другая возможность для вашего ThreadAbortException - это любой код, который выполняется вне жизненного цикла запроса страницы на стороне сервера, например HttpModules и HttpHandlers. Любые исключения, созданные в модуле или обработчике, не попадают в механизм необработанных исключений по умолчанию в ASP.Net и могут привести к прекращению работы потока.

Согласно этой статье, есть несколько исключений, которые не могут быть легко обработаны в ASP.net или CLR в целом:

Рекомендации по надежности

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

Надеюсь, это поможет!

Ответ принят как подходящий

Судя по тому, что вы говорите, вы отправляете исходящий WebRequest на внешний ресурс изнутри обработки входящего запроса к приложению ASP.NET. Здесь важны (как минимум) два тайм-аута:

  • WebRequest.Timeout (по умолчанию 100000 мс = 100 с) указывает тайм-аут для выполнения исходящего WebRequest. Если этот тайм-аут истечет, вы должны получить WebException - так что это не ваша проблема.

  • HttpRuntime, обрабатывающий ваш входящий запрос, имеет тайм-аут выполнения: значение по умолчанию в соответствии с MSDN составляет 110 с для .NET 2.0 или новее, 90 с для .NET 1.x. По истечении этого тайм-аута вы получите исключение ThreadAbortException. Похоже, вот что происходит.

В .NET 1.x этого можно было ожидать, потому что значение HttpRuntime executionTimeout по умолчанию меньше, чем WebRequest.Timeout. В .NET 2.0 этого можно ожидать с тайм-аутом по умолчанию, если вы уже потратили> 10 секунд перед выполнением исходящего WebRequest (например, если у вас есть более одного исходящего WebRequest из одного входящего запроса).

Я бы посоветовал вам либо:

  • Уменьшите WebRequest.Timeout для исходящих запросов и обработайте WebException, или

  • Если исходящие запросы действительно могут длиться так долго, увеличьте время ожидания выполнения httpRuntime, как описано в MSDN.

httpRuntime.executionTimeout был виновником моего сценария - спасибо!

RobSiklos 22.11.2012 22:50

Другие вопросы по теме