Ответ 1
Да, это действительно по дизайну. Microsoft даже документировала его. Как еще вы остановите остальную часть своей программы?
когда 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
Является ли это обычным поведением и можно ли изящно прервать вместо (что похоже) внезапное внезапное прерывание?
Пока это общая перепись, она по дизайну. Так что я задаюсь вопросом, возможно ли, мы могли бы взять этот вопрос и посмотреть, можем ли мы изменить код, чтобы он не чувствовал, что мы заканчиваем поток преждевременно и изящно выходим... Возможно? Примеры кода?
Да, это действительно по дизайну. Microsoft даже документировала его. Как еще вы остановите остальную часть своей программы?
Нет такой вещи, как "изящный" прерывание. Вы могли бы просто сбросить() ответ, но вместо того, чтобы закончить его, и пусть структура позаботится о том, чтобы закрыть соединение для вас. В этом случае я предполагаю, что вы хотите получить ответ, отправленный клиенту, т.е. Типичный случай.
В соответствии с 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-запроса или ответа, нарушающего жизненный цикл страницы. Используйте HttpContext.Current.Response.Close() или HttpContext.Current.ApplicationInstance.CompleteRequest();
Я использовал все вышеперечисленные изменения, но все же у меня была такая же проблема в моем веб-приложении.
Затем я связался с моим хостингом и попросил их проверить, не запрещается ли какое-либо программное обеспечение или антивирус блокировать наши файлы через HTTP. или ISP/сеть не позволяет передавать файл.
Они проверили параметры сервера и обходили "Общий брандмауэр центра обработки данных" для моего сервера, и теперь наше приложение начало загружать файл.
Надеюсь, что этот ответ поможет кому-то. Это то, что сработало для меня