ルーティング機能

ASP.NETのルーティング機能。ASP.NET MVCのそれがASP.NETへ統合されたらしい。

ルーティングの有効化

IIS7.0以前のバージョンで使用する場合、modulesノードへUrlRoutingModuleを追加する必要がある。 以降の場合はmodulesノードのrunAllManagedModulesForAllRequests属性値をtrueにすることで、 すべてのリクエストに対してルーティングが適用されるようになる。

ルーティングテーブル

HttpApplicationのApplication_Startイベントでルーティングテーブルをセットアップする。 System.Web.Routing.RouteTable.Routesプロパティ(static)へRouteオブジェクトを追加する。 RouteクラスコンストラクタのIRouteHandler実装クラスとして、基本的にはPageRouteHandlerオブジェクトを渡す。 RouteCollectionコレクションクラスの拡張メソッドであるSystem.Web.Mvc.RouteCollectionExtensions.MapRouteを使用して、 ルーティング情報を追加する。このメソッド内でRouteオブジェクトを生成し、Routesコレクションへ追加する。 IRouteHandler実装クラスは、MvcRouteHandlerオブジェクト。

ルーティング処理

HttpApplicationのPostResolveRequestCache、PostMapRequestHandlerイベントで UrlRoutingModuleモジュールによるルーティングが行われる。 一致するルートが存在しなかった場合は以降の処理を通常ASP.NETフロー?で行う。

最初に一致したルート情報(Routeオブジェクト)のGetHttpHandler()から、IHttpHandlerオブジェクトを取得し、これをHttpApplicationに渡す? (それぞれ、HttpHandlerクラス、MVCHandlerクラス)

ハンドラ処理

HttpApplicationのPreRequestHandlerExecuteイベント直後に行われる。 ハンドラからコントローラークラス生成〜アクションメソッド呼び出しを行う。 MVCHandler.ProcessRequest()で、ルーティング情報のコントローラー名からControllerクラスを生成し、そのcontrollerのExecute()呼び出しを行う。 このとき、ルーティング情報からcontroller内部で呼び出すアクションメソッドが決定される。 アクションメソッドでProcessRequest()パラメタのHttpContextオブジェクトに応答書き込みを行う。

アクションメソッドの実行はcontrollerが持つ、ControllerActionInvokerクラスオブジェクトによって実行される。 この時に、コントローラーのフィルタリング属性なども処理される。