しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

IIS Express TestKit で使う設定を XML Document Transform を使って操作するようにしてみた

ぼちぼち改善している 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 を使うことでわかりやすく、そして柔軟に設定が出来るようになったと思います。

実際のテストプロジェクトでは、ファイル構造は以下のようになります。

f:id:shiba-yan:20160730180753p:plain

IIS Express TestKit のリポジトリには動作するテストコードも置いてあるので、使い始める場合には参考にしてみてください。Outbound Rule のサンプルテストも書いてあります。

f:id:shiba-yan:20160730181030p:plain

最近は AppVeyor を使って URL Rewrite を含むテストを実行するように設定しているので、こちらも併せて参考にしてもらえると良いかもしれません。

IIS Express なので CI サーバーでも簡単に URL Rewrite のテストを実行できています。