ぼちぼち改善している IIS Express で URL Rewrite のテストを書くパッケージですが、設定周りに柔軟性が無くかなりイマイチだと思っていたので XML Document Transform を使って改善しました。
NuGet に公開している最新版では XDT が使えるようになっています。
これまでのバージョンでは system.webServer の rewrite 部分のみ変更可能で、定義したファイルには rewrite 以下の設定を 1 つにまとめる必要がありました。
IIS Express TestKit ではデフォルトで以下のような Web.config を生成するので、発想としては Visual Studio の発行時の処理と同じです。この定義に対して XDT で追加を行うわけです。
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="EchoHttpHandler" verb="*" path="*" type="IisExpressTestKit.EchoHttpHandler, IisExpressTestKit" resourceType="Unspecified" /> </handlers> <modules runAllManagedModulesForAllRequests="true"> <add name="EchoHttpModule" type="IisExpressTestKit.EchoHttpModule, IisExpressTestKit" /> </modules> </system.webServer> </configuration>
変換を定義した XDT は Transform.config という名前で保存すると、IIS Express の起動前に Web.config への反映が自動的に行われます。
例を挙げると、以下のような内容で Transform.config を作成する形になります。
<?xml version="1.0" encoding="utf-8"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <system.webServer> <rewrite xdt:Transform="Insert"> <rules> <rule name="Redirect" stopProcessing="true"> <match url="^redirect" /> <action type="Redirect" url="http://www.google.co.jp" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
実行時にはリダイレクトのルールがちゃんと追加された形で IIS Express が起動されるので、あとはこれまで通りテストケースを書いていくだけです。
configSource を使って別ファイルを読み込む
Web.config などは configSource 属性を使うことで、別ファイルに定義を分割することが出来るので、今回 XDT の追加と同じタイミングで configSource の処理を行うように実装しました。
先ほどと同じ定義を configSource を使って書き換えてみます。Transform.config は以下のように修正します。
<?xml version="1.0" encoding="utf-8"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <system.webServer> <rewrite xdt:Transform="Insert"> <rules configSource="..\..\Rewrite.config" /> </rewrite> </system.webServer> </configuration>
作業としては rules の中身を削除し、configSource をパスを追加します。そして Rewrite.config という名前で rules の中身をそっくりコピーして保存しました。
<rules> <rule name="Redirect" stopProcessing="true"> <match url="^redirect" /> <action type="Redirect" url="http://www.google.co.jp" /> </rule> </rules>
これだけの修正で Rewrite のルールを別ファイルに分離して、テスト時には読み込んで実行することが出来るようになります。XDT を使うことでわかりやすく、そして柔軟に設定が出来るようになったと思います。
実際のテストプロジェクトでは、ファイル構造は以下のようになります。
IIS Express TestKit のリポジトリには動作するテストコードも置いてあるので、使い始める場合には参考にしてみてください。Outbound Rule のサンプルテストも書いてあります。
最近は AppVeyor を使って URL Rewrite を含むテストを実行するように設定しているので、こちらも併せて参考にしてもらえると良いかもしれません。
IIS Express なので CI サーバーでも簡単に URL Rewrite のテストを実行できています。