При вызове ASP.NET System.Web.HttpResponse.End () текущий поток прерывается - PullRequest
18 голосов
/ 13 декабря 2008

когда 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 ]

11 голосов
/ 13 декабря 2008

Нет такой вещи, как "изящный" аборт. Вы можете просто Flush () ответ, вместо того, чтобы завершить его, и позволить фреймворку позаботиться о закрытии соединения для вас. В этом случае я предполагаю, что вы хотите, чтобы ответ был отправлен клиенту, то есть типичный случай.

Согласно MSDN , вызов Response.End () вызывает исключение ThreadAbortException, когда ответ заканчивается преждевременно. Вы действительно должны вызывать Response.End () только тогда, когда вы хотите, чтобы возникло исключение.

6 голосов
/ 13 декабря 2008

Да, это действительно задумано. Microsoft даже задокументировала это. Как еще вы могли бы остановить выполнение остальной части вашей программы?

3 голосов
/ 13 декабря 2008

Нет ничего изначально неблагодарного в исключении, повторяющем ваш стек для остановки текущего выполнения. Конечно, не больше, чем вы бросаете исключение и ловите его в каком-то более низком месте в вашем исключении.

Я бы посмотрел на фильтрацию по вашей регистрации. Если вы используете мониторинг работоспособности ASP.Net, вы можете настроить / сопоставить каждое исключение с определенным провайдером (журнал событий, почта и т. Д.), Чтобы контролировать, получаете ли вы уведомления об исключениях из потока или нет. Если это пользовательская регистрация, я бы просто добавил if, чтобы проверить это.

Обратите внимание, что вы не можете использовать исключение ThreadAbortException, поэтому даже если ваш код ведения журнала делает что-то вроде catch(Exception e) { // log exception and then do not throw again }, исключение ThreadAbortException будет по-прежнему вызываться платформой после выхода из блока catch.

0 голосов
/ 13 ноября 2017

Я использовал все вышеперечисленные изменения, но все же у меня возникала та же проблема с моим веб-приложением.

Затем я связался со своим хостингом и попросил их проверить, не блокирует ли какое-либо программное обеспечение или антивирус наши файлы для передачи по HTTP. или Интернет-провайдер / сеть не позволяет передавать файл.

Они проверили настройки сервера и пропустили «Общий брандмауэр центра данных» для моего сервера, и теперь наше приложение начало загружать файл.

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

0 голосов
/ 06 июня 2017

Не используйте метод Response.End (), поскольку он использует Application.End () и останавливает приложение. Далее используйте HTTP-запрос или ответ, нарушающий Page Life Cycle. Используйте HttpContext.Current.Response.Close () или HttpContext.Current.ApplicationInstance.CompleteRequest ();

...