Я живу в кошмарах из-за этой ситуации, у меня есть 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 (), который тоже имеет свои плохие эффекты, он будет поддерживать поток, и бог знает, как долго.
Вы может поймаете ThreadAbortException, вам просто нужно обработать его правильно. ResetAbort () - это то, что нужно сделать, когда вы закончите. Подробнее см. msdn.microsoft.com/en-us/library/….





У меня возникла проблема с использованием 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.
Я видел обе проблемы, перечисленные Эндрю и "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 был виновником моего сценария - спасибо!
Попробуйте перехватить System.Exception во второй строке и посмотреть, какой тип ex выбрасывается.