2013-09-27 7 views
7

authorize属性のライフサイクルが、適用されるクラスまたはメソッドに関連して管理されているように見える理由を説明できますか?これは、要求ライフサイクルに関連して管理されるのとは対照的です。属性ライフサイクルの承認

コントローラをクラスレベルでデコレートする場合、authorize属性コンストラクタは、同じコントローラへの複数のリクエストにわたって1回のみ呼び出されます。私は各コントローラメソッドを飾る場合は、呼び出された各コントローラメソッドの新しいauthorize属性コンストラクタ呼び出しを取得します。

この動作については何ですか?属性の作成が許可されるたびに、属性の作成が行われることが期待されます。

+0

クラスに適用すると一度だけ呼び出されると判断していますか? AFAIKでは、コントローラーはインスタンス化され、要求ごとに破棄されます。それは*あるべき*のものであるか、あるいはクロスリクエストの汚染に終わるでしょう。 Visual Studioでデバッグするときに何らかの理由でこれを回避することは可能ですが、実際のIIS上のすべての要求に対して同じコントローラインスタンスを使用している場合は問題があります。 –

+0

Chris、コントローラーのライフサイクルについては言及していませんでした。むしろ、私はAuthorizeAttributeのライフサイクルについて尋ねています。 AuthorizeAttributeはすべての要求に対して作成されていません。残念ながら、ランタイムでロールを変更する必要があるため、この現在のアプリケーションではいくつかの問題が発生します。 – Daniel

答えて

8

ASP.NET MVCはActionFiltersをキャッシュし、その後のリクエストで再利用しようとします。実際の承認は各リクエストで行われますが、コンストラクタは最初に呼び出されます。 ActionFilterで内部状態を維持すべきではありません。