当调用ASP.NET System.Web.HttpResponse.End()时,当前线程被中止?

时间:2008-12-13 14:15:49

标签: asp.net httpresponse thread-abort

当调用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

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

更新

到目前为止普通人口普查是by design。所以我想知道是否有可能我们可以接受这个问题,看看我们是否可以调整代码,让我们觉得我们不会过早地结束线程 并优雅地退出......可能吗?代码示例?

5 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:6)

是的,这确实是设计上的。微软甚至documented。你怎么能阻止你的程序的其余部分执行?

答案 2 :(得分:3)

对于一个异常递归堆栈以阻止当前执行,没有什么不妥协的。当然不过是你抛出一个异常并在异常中的某个较低位置捕获它。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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