asp.net MVC3 でアプリケーションを開発していますが、次の質問があります: HTTP モジュールとアクション フィルターはいつ記述すればよいですか?
3 に答える
フィルターは物事を行うためのよりMVCのアプローチですが、Httpモジュールは物事を行うためのASP.NETの方法です。どちらも、処理パイプラインにフックを提供することで同様の目的を果たします。
HttpModule はより一般的で、すべてのリクエストで何かを処理したい場合に使用します。フィルターは、アクション固有の動作を追加するのに役立ちます。
HTTP リクエストごとに 1 回だけ何かを実行したい場合は、HttpModule を使用する必要があります。ActionFilter は、IsChildActionOn をチェックするまで、またはチェックしない限り、リクエスト中に数回実行される場合があります。
HttpModuleは、リクエスト ハンドラーが実行される前後に呼び出されます。これらは、開発者が各リクエストをインターセプト、参加、または変更できるようにすることを目的としています。サブスクライブできる 22 の使用可能なイベントがあり、モジュールがプロセスのさまざまな段階で要求を処理できるようにします。このイベントは、重要なリクエスト パイプライン イベントが発生したときにコードを実行したいページ開発者にとって便利です。また、カスタム モジュールを開発していて、パイプラインへのすべての要求に対してモジュールを呼び出す場合にも役立ちます。
フィルターは、MVC 要求のライフ サイクルの間にロジックを挿入するように設計されています。具体的には、アクションが呼び出される前後、および結果が処理される前後です。フィルターは、MVC プロジェクト内で行われているいくつかのことを検査、分析、キャプチャ、および計測するための強力な方法をユーザーに提供します。MVC5 の時点で、5 種類のフィルターがあります。
- 認証
- 認可
- アクション
- 結果
- 例外
したがって、http リクエスト パイプラインの 22 のイベントの特定をインターセプト、参加、または変更する場合は、モジュールを選択します。ロジックがアクション メソッドに厳密に関連している場合は、サーバーで次の ActionFilterAttribute メソッドのいずれかをオーバーライドすることをお勧めします。
- OnActionExecuting
- OnActionExecuted
- OnResultExecuting
- OnResultExecuted
HttpModuleは、イベント ハンドラーをHttpApplicationイベントにアタッチできるようにすることで、IIS が Web アプリケーションで既定の動作をオーバーライドしたり、カスタム ロジックを追加できるようにする方法です。IIS モード (統合またはクラシック) が異なれば、Web.config 設定も異なります。
参照:
http://msdn.microsoft.com/en-us/library/ms227673(v=vs.100).aspx
例: www 以外の URL を www URL にリダイレクトする
public void Init(HttpApplication application)
{
application.PreRequestHandlerExecute += this.Application_PreRequestHandlerExecute;
}
private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
Uri requestUrl = HttpContext.Current.Request.Url;
string host = requestUrl.Authority.ToLower();
if (!host.StartsWith("www"))
{
HttpContext.Current.Response.Redirect(requestUrl.Scheme + "://www." + host + requestUrl.PathAndQuery);
HttpContext.Current.Response.End();
}
}
アクション フィルターは、コントローラーまたはアクション メソッドを装飾する属性です。これは、MVC ルーティングとアクション メソッドの間の抽象化レイヤーです。アクション フィルターを使用すると、同じロジックを複数のコントローラーまたはアクション メソッドに適用できます。たとえば、カスタム ロギングです。