我有一个ASP.NET小型计算实例中的Windows HTTP Azure托管的ASP.NET HTTP处理程序。它处理大型二进制文件的下载和上传。根据指导原则,其他任何内容都不会在该Web角色中运行,并且会配置2个实例。当从连接速度慢的计算机上下载完成时,我试图一次执行多次下载以扼住客户端的带宽,有时我会在处理程序中得到一个ThreadAbortException
,通常在.Write
到Response.OutputStream
(我设置预先设定为Response.BufferOutput = false
)。堆栈跟踪如下:在Windows Azure的HTTP处理程序中是否需要ThreadAbortException?
System.Threading.ThreadAbortException: Thread was being aborted.
at System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr context)
at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
at System.Web.HttpResponse.Flush(Boolean finalFlush)
at System.Web.HttpWriter.WriteFromStream(Byte[] data, Int32 offset, Int32 size)
at MyHandler.ProcessGetRequest(HttpContext context)
at MyHandler.ProcessRequest(HttpContext context)
(该Stream.Write
通话显然是内联,因此不会在堆栈跟踪显示)。
为什么线程被中止?我猜测我正在触及某种超时(可能是套接字写入超时),是否将线程放弃为ASP.NET运行时处理它的正常方式?
请注意,它是一个HTTP处理程序,而不是.aspx/.cshtml页面或MVC控制器,并且在我的代码中无处触摸Response.End
,Response.Redirect
或Server.Transfer
。
ThreadAbortedException是一般例外,一般没有告诉正是问题的所在。请尽量让代码预期偶然的意外异常,并在可能的情况下重试该操作。 – 2012-07-11 11:27:53