0

カスタムIControllerFactoryを実装して、asp.netmvcコントローラーを作成しています。このファクトリのCreateControllerメソッドでは、コントローラーを作成するスレッドが一意であるという事実に依存しています。これは、ReleaseControllerが呼び出される前に、そのスレッド上に他のコントローラーが作成されないことを意味します。

現在、高負荷テストの下で、問題が発生しています。スレッド1、2、3でコントローラーを作成したとすると、最初のコントローラーがIControllerFactory.ReleaseControllerを呼び出す前に、新しいコントローラーがスレッド1で作成されているようです。

これは予想される動作ですか?コントローラへの各リクエストは別々のスレッドで処理されますよね?IControllerFactoryのReleaseControllerメソッドが呼び出される前に、同じスレッドが別のリクエストに再利用されるのはなぜですか?

お時間をいただきありがとうございます、Koen

4

1 に答える 1

2

このファクトリのCreateControllerメソッドでは、コントローラーを作成するスレッドが一意であるという事実に依存しています。これは、ReleaseControllerが呼び出される前に、そのスレッド上に他のコントローラーが作成されないことを意味します。

あなたは絶対にそのような振る舞いに頼ることはできません。それを保証するものは何もありません。非同期コントローラーを使用すると、事態はさらに悪化する可能性があります。

これは予想される動作ですか?

はい。

コントローラへの各リクエストは別々のスレッドで処理されますよね?

いいえ。

IControllerFactoryのReleaseControllerメソッドが呼び出される前に、同じスレッドが別のリクエストに再利用されるのはなぜですか?

ASP.NETは、スレッドプールを使用して要求を処理します。したがって、たとえば、リクエストを処理するためにこのプールからスレッドが引き出され、後でこのスレッドは再利用のためにプールに返されます。したがって、2つの完全に別個の要求に対して、同じスレッドにコントローラーコードを実行させることは完全にうまくいく可能性があります。

スレッドにASP.NETアプリケーションを絶対に依存しないでください。リクエストごとの特定の情報を保存する場合は、スレッドではなくHttpContextストレージを使用する必要があります。安全を確保したい場合は、ASP.NETアプリケーションのスレッドを忘れてください。

于 2013-01-13T10:36:01.750 に答える