10

[ThreadStatic] フィールドに状態を保存する asp.net mvc3 アプリケーション (IIS7 上) で独自の IoC メカニズムを使用しているため、HttpApplication.BeginRequest、HttpApplication.EndRequest、および (単一の)関連するリクエストは同じスレッドで実行されます。

その仮定は正しいですか?

4

1 に答える 1

9

その仮定は正しいですか?

いいえ、この仮定は正しくなく、その証拠があります。ASP.NETの唯一の信頼できるリクエストごとのストレージメカニズムはですHttpContext.Items

[ThreadStatic]ASP.NETアプリケーションで要求ごとの値を格納するためにフィールドを使用しないでください。たとえば、非同期コントローラーがある場合は、エンジンにスレッドプールから1つの要求を描画させて要求の処理を開始し、IOCP(I / O完了ポート)に依存して非同期操作を開始し、最後にリクエストを完了するためのプール。したがって、同じHTTPリクエストを処理する2つの異なるスレッドを持つことができます。

HTTPリクエストが同じスレッドによって処理されるという事実に絶対に依存しないでください。

これは同期リクエストの場合に当てはまる可能性がありますが、これは単なる実装の詳細であることに注意してください。これは、.NETのあるバージョンから別のバージョンに予告なしに変更される可能性があります。[ThreadStatic]これに依存したり、ASP.NETで使用したりしないでください。これはあなたをひどく噛む可能性があります。

于 2012-01-01T22:49:42.047 に答える