「小さな」コンピューティング インスタンスで Windows Azure にホストされている ASP.NET HTTP ハンドラーがあります。大きなバイナリ ファイルのダウンロードとアップロードを処理します。その Web ロール内では他に何も実行されず、ガイドラインに従って 2 つのインスタンスが構成されています。接続が遅いコンピューターからダウンロードを行い、一度に複数のダウンロードを実行してクライアント側の帯域幅を制限しようとするとThreadAbortException
、ハンドラーで が取得さ.Write
れる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
。