ASP.NET ルーティングはどのような仕組みで実現されているのでしょうか。
これを理解するには、まずASP.NETの仕組みを理解しておく必要があります。
ASP.NETの仕組み
上記ページのうち、1から3の部分を特におさえておいてください。
この部分を大雑把にまとめると、
- HttpContextがリクエストを受け取ってからレスポンスを返すまで一種のグローバルオブジェクトとして存在している
- HttpApplicationが様々なイベントを発生させるタイミングでIHttpModuleが各種処理を実行することができる
- 実際に実行されるのはHttpContextのHandlerプロパティに設定されているIHttpHandler(のProcessRequestメソッド)である
ということをまず頭においてください。
ASP.NET ルーティングを利用するにはweb.configにUrlRoutingModuleを登録します。
Moduleは登録されると、すべてのリクエストに対して実行されます。
このUrlRoutingModuleがブラウザからのリクエストを調べて、登録されているルートに合致するかどうかを判断します。
このとき、リクエストされているURLが現在存在しているファイル(aspxなど)を直接指定している場合は、ルートとの合致の調査は行われず(デフォルトの動作)、指定されているファイルがそのまま呼び出されます。
それ以外の場合で登録されているルートがあったら、そのルートに対して設定されているIRouteHandlerのGetHttpHandlerメソッドが呼び出されます。
IRouteHandlerの実装例やその登録の仕方については下記のページを参考にしてください。
ASP.NET ルーティングを実装する
GetHttpHandlerメソッドはIHttpHandlerを返すことが求められています。
で、ここで返されたIHttpHandlerがHttpContextのHandlerプロパティに設定されます。
そして、このHandlerプロパティに設定されているIHttpHandlerのProcessRequestが実行されることになります。
要するにとっても簡単に言うと、UrlRoutingModuleが処理を横取りして、実行されるページ(のインスタンス)を置き換えてしまう、というのがASP.NET ルーティングが行っている動作です。
また、その中でどんなページに置き換えるかを指定するためにIRouteHandlerの実装が必要、ということになります。
ちょっと気をつけないといけないのは、IHttpHandlerのインスタンスのレベルで置き換えが行われている、ということですね。
リクエストの処理の中で内部的にリクエストされたURLを書き換えてしまう(RewritePath)のと異なり、URLの変更は行われないので、ポストバック先はもともとリクエストされたURLになりますし、クエリ文字列としてURLに含まれたデータを取り出すことはできない、ということになります。
さて、ここまででASP.NET ルーティングの仕組みとその実装方法(上記ページ参照)を説明しました。
あと、aspxページ内でルーティングに合わせたURLを生成する方法については、下記を参照していただければよいと思います。
方法:ルートからURLを構築する
これで、実際のASP.NETアプリケーションの中でASP.NETルーティングを利用するための準備は整ったのではないかと思います。
現実にどのようなルーティングをアプリケーションで使っていくのがよいか、これからいろいろ考えてみます。