Когда вызывается 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

Является ли это обычным поведением и можно ли изящно прервать вместо (что похоже) внезапное внезапное прерывание?

Update

Пока это общая перепись, она по дизайну. Так что я задаюсь вопросом, возможно ли, мы могли бы взять этот вопрос и посмотреть, можем ли мы изменить код, чтобы он не чувствовал, что мы заканчиваем поток преждевременно и изящно выходим... Возможно? Примеры кода?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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