Когда вызывается ASP.NET System.Web.HttpResponse.End(), текущий поток прерывается?
Когда System.Web.HttpResponse.End() вызывается как System.Thread.Abort, что, я предполагаю, является (или вызывает) исключением? У меня есть некоторые записи, и это указано в файле журнала...
Первый шанс
exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
12/14/2008 01:09:31::
Error in Path :/authenticate
Raw Url :/authenticate
Message :Thread was being aborted.
Source :mscorlib
Stack Trace : at System.Threading.Thread.AbortInternal()
at System.Threading.Thread.Abort(Object stateInfo)
at System.Web.HttpResponse.End()
at DotNetOpenId.Response.Send()
at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider()
at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\Services\Authentication\OpenIdAuthenticationService.cs:line 108
at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\MVC Application\Controllers\AuthenticationController.cs:line 69
TargetSite :Void AbortInternal()
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL
An exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL but was not handled in user code
Это нормальное поведение и можно ли изящно прервать вместо (как выглядит) внезапного внезапного прерывания?
Обновить
Пока это общая перепись, что это по замыслу. Поэтому мне интересно, возможно ли, что мы могли бы взять этот вопрос и посмотреть, сможем ли мы настроить код, чтобы не было ощущения, что мы преждевременно заканчиваем поток и грациозно завершаем работу... Возможно? Примеры кода?
5 ответов
Да, это действительно так. Microsoft даже задокументировала это. Как еще вы могли бы остановить выполнение остальной части вашей программы?
Нет такой вещи, как "изящный" аборт. Вы можете просто Flush() ответ, вместо того, чтобы завершить его, и позволить фреймворку позаботиться о закрытии соединения для вас. В этом случае я предполагаю, что вы хотите, чтобы ответ был отправлен клиенту, то есть типичный случай.
Согласно MSDN, вызов Response.End() создает исключение ThreadAbortException, когда ответ заканчивается преждевременно. Вы действительно должны вызывать Response.End() только тогда, когда вы хотите, чтобы возникло исключение.
Нет ничего изначально неблагодарного в исключении, повторяющем ваш стек для остановки текущего выполнения. Конечно, не больше, чем вы бросаете исключение и ловите его на каком-то более низком месте в вашем исключении.
Я бы посмотрел на фильтрацию по вашей регистрации. Если вы используете мониторинг работоспособности ASP.Net, вы можете настроить / сопоставить каждое исключение с данным провайдером (журнал событий, почта и т. Д.), Чтобы контролировать, получаете ли вы уведомления об исключениях из потока или нет. Если это пользовательская регистрация, я бы просто добавил if, чтобы проверить это.
Обратите внимание, что вы не можете использовать исключение ThreadAbortException, даже если ваш код входа в систему делает что-то вроде catch(Exception e) { // log exception and then do not throw again }
ThreadAbortException по-прежнему будет вызываться платформой снова после выхода из блока catch.
Не используйте метод Response.End(), поскольку он использует Application.End() и останавливает приложение. Далее используйте HTTP-запрос или ответ, нарушающий Page Life Cycle. Используйте HttpContext.Current.Response.Close() или HttpContext.Current.ApplicationInstance.CompleteRequest();
Я использовал все вышеперечисленные изменения, но все же у меня возникала та же проблема с моим веб-приложением.
Затем я связался со своим хостингом и попросил их проверить, не блокирует ли какое-либо программное обеспечение или антивирус наши файлы для передачи по HTTP. или Интернет-провайдер / сеть не позволяет передавать файл.
Они проверили настройки сервера и пропустили "Общий брандмауэр центра данных" для моего сервера, и теперь наше приложение начало загружать файл.
Надеюсь, что этот ответ кому-то поможет. Вот что сработало для меня