18

当 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

这是正常行为吗,是否可以优雅地中止而不是(看起来像)突然中止?

更新

到目前为止,这是设计使然的普查。所以我想知道我们是否有可能提出这个问题,看看我们是否可以调整代码以使其不会感觉我们过早地结束线程并优雅地退出......可能吗?代码示例?

4

5 回答 5

11

没有所谓的“优雅”中止。但是,您可以简单地 Flush() 响应,而不是结束它并让框架为您关闭连接。在这种情况下,我假设您希望将响应发送给客户端,即典型情况。

根据MSDN,当响应过早结束时,调用 Response.End() 会引发 ThreadAbortException。当你想要引发异常时,你真的应该只调用 Response.End() 。

于 2008-12-13T14:36:08.333 回答
6

是的,这确实是设计使然。微软甚至已经记录了它。否则您将如何阻止程序的其余部分执行?

于 2008-12-13T14:41:12.877 回答
3

异常递归堆栈以停止当前执行本身并没有什么不优雅的。当然,只不过是您抛出异常并在异常中的某个较低位置捕获它。

我会考虑从您的日志中过滤它。如果您使用 ASP.Net 运行状况监视,您可以配置/映射每个异常到给定的提供程序(事件日志、邮件等),以控制是否收到有关线程中止异常的通知。如果它是自定义日志记录,那么我只需添加一个 if 来检查它。

请注意,您不能吃 ThreadAbortException 因此,即使您的日志记录代码正在执行类似catch(Exception e) { // log exception and then do not throw again }ThreadAbortException 的操作,一旦您的 catch 块退出,框架仍会再次引发。

于 2008-12-13T18:37:30.900 回答
0

不要使用 Response.End() 方法,因为它使用 Application.End() 并停止应用程序。进一步使用违反页面生命周期的 HTTP 请求或响应。使用 HttpContext.Current.Response.Close() 或 HttpContext.Current.ApplicationInstance.CompleteRequest();

于 2017-06-06T11:31:07.620 回答
0

我使用了上述所有更改,但我的 Web 应用程序仍然遇到同样的问题。

然后我联系了我的托管服务提供商并要求他们检查是否有任何软件或防病毒软件阻止我们的文件通过 HTTP 传输。或 ISP/网络不允许文件传输。

他们检查了服务器设置并绕过了我的服务器的“数据中心共享防火墙”,现在我们的应用程序开始下载文件。

希望这个答案会对某人有所帮助。这对我有用

于 2017-11-13T04:06:00.023 回答