ここまでで筆者の事例を基にしたWebフォームからMVCへの移行/共存作業は完了だ。しかし、URLフォーマットがWebフォームとMVCで全く異なることに違和感を覚えた読者もいるかもしれない。そこで、最後に余談として、クライアント・ブラウザに表示されるURLをWebフォーム特有の「*.aspx」といった形から、よりユーザー・フレンドリなURLに書き換えることのできるオープンソースのライブラリ「UrlRewriter.NET」を紹介する。
●UrlRewriter.NET
UrlRewriter.NETとは、クライアントがリクエストしたURLを、アプリケーション上で任意の形に書き換えることができるライブラリだ。同様の機能を持つものとして、有名なところではApacheの「mod_rewrite」モジュールや、IISの拡張モジュールである「URL Rewrite」などがある。
●UrlRewriter.NETの導入と設定
UrlRewriter.NETのインストールはNuGetから(次に示すコマンドを使って)簡単に行える。
PM> Install-Package Intelligencia.UrlRewriter
●URL書き換えルールの設定
インストールが完了したら、Web.configファイルにURL書き換えルールを次のとおりに設定する。
<configuration>
<configSections>
<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
<system.web>
……省略……
<httpModules>
<add type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" name="UrlRewriter" />
</httpModules>
</system.web>
<rewriter>
<rewrite url="~/About" to="~/About.aspx" />
<rewrite url="~/Book/Index" to="~/List.aspx" />
</rewriter>
</configuration>
ここでは、<rewrite>要素に書き換え対象とするURLの定義と、書き換え後のURLを設定している。例えば、
<rewrite url="~/Book/Index" to="~/List.aspx" />
という記述は、「http://yourdomain/Book/Index」へのリクエストを、内部的には「http://yourdomain/List.aspx」というURLにリクエストされたことにする、という設定だ。実際にこのURLにアクセスしてみると、書籍一覧画面(List.aspx)が表示されることが分かる。次の画面はVisual Studioからアプリケーションを実行した結果だ。アドレスバーに注目してほしい。
実際のアプリケーションでURLの書き換えを行う場合はこのように単純にはいかないだろうが、UrlRewriter.NETで設定可能なURL書き換えルールは非常に柔軟なため、よほど複雑なURLを持つアプリケーションでなければ十分対応可能だろう。書き換えルールの詳細は公式のヘルプページで確認できる。
●IIS 7.5で動作させる
では、アプリケーションをIIS 7.5に発行し、実際にアクセスしてみる。すると、次の画面のようなエラーが出るはずだ。
これは、IIS 6.0およびIIS 7.0のクラシック・モード、ASP.NET開発サーバーと、IIS 7.0以降の統合モードとで、HTTPモジュールの登録方法が異なるために発生しているエラーだ*7。UrlRewriter.NETはHTTPモジュールとしてURLの書き換えを実施しているため、動作させるためにはWeb.configファイルにさらに修正が必要となる(具体的には次のように修正する)。
<configuration>
<configSections>
<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
<system.web>
……省略……
<httpModules>
<add type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" name="UrlRewriter" />
</httpModules>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
<rewriter>
<rewrite url="~/About" to="~/About.aspx" />
<rewrite url="~/Book/Index" to="~/List.aspx" />
</rewriter>
</configuration>
Web.configファイルを修正後、アプリケーションを発行して、再度アクセスすると正常に動作していることを確認できる(次の画面を参照)。
ただし、<validation>要素のvalidateIntegratedModeConfiguration属性を無効にすると、IIS 7.0以降の統合モードでサポートしていない構成があったとしてもエラーが発生しなくなるため、プロダクション環境での利用は推奨されていない。開発時の利用にとどめるか、Visual Studio 2010以降を利用しているのであればWeb.configファイルをデバッグ時とリリース時で異なる構成にする対応を行うべきだ。
*7 詳細については、MSDNの「ASP.NET と IIS 7 の統合」を確認してほしい。
ASP.NET MVCの登場によってASP.NET開発には今、大きな変化が起こっている。Webフォームでの開発がなくなるとは思わないが、これから新しいアプリケーションを作成するときの主流はMVCになっていくだろう。
一方で、すでにWebフォームで構築して保守フェイズに入っているアプリケーションでも将来的な移行を前提にピンポイントでMVCを採用することも、多少の手間を掛ければ可能であることを本稿で示した。「昔に作られたシステムだから」とあきらめるようなことはせず、移行や共存などでコストを最小限に抑えつつ新しい技術を積極的に利用するようにしたい。
Copyright© Digital Advantage Corp. All Rights Reserved.