我有一个托管在 Windows Azure 上的“小型”计算实例中的 ASP.NET HTTP 处理程序。它处理大型二进制文件的下载和上传。该 Web 角色内没有其他任何运行,并且根据指南配置了 2 个实例。当从连接速度较慢的计算机完成下载并且我尝试一次执行多个下载以阻塞客户端的带宽时,有时我会ThreadAbortException
在处理程序中得到一个,最常见的是在 a .Write
to the Response.OutputStream
(我Response.BufferOutput = false
事先设置)期间。堆栈跟踪如下:
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