4

「小さな」コンピューティング インスタンスで 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.EndResponse.RedirectくださいServer.Transfer

4

1 に答える 1

5

大きなファイルをアップロードすると、IIS は要求ストリームを読み取ろうとし、それが 5 分以上ブロックされると、IIS は最終的に ThreadAbortException をスローします。

この行で遊んでみてください:

<httpRuntime maxRequestLength="2097150" executionTimeout="3600"/>

次の提案も試してください: http://cutesoft.net/forums/permalink/77440/77438/ShowThread.aspx#77438

于 2014-03-29T08:45:59.797 に答える