しばやん雑記

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

ASP.NET MVC 3 開発入門 (22) - Web.config を変更

ASP.NET MVC 3 開発入門 - インデックス

Visual Studio 2010 からデバッグ用とリリース用で Web.config の変換を行う機能が標準で使われるようになりました。Web 発行時に XDT を使ってベースとなる Web.config の要素を自由に書き換えることが出来ます。この機能を使うことで、デバッグ時とリリース時で別々のデータベースを参照するように構成したり、エラー表示を変えたりなどが出来るようになります。

変換を行うために、デフォルトで Web.Debug.config と Web.Release.config という 2 つのファイルが追加されました。ファイル名からわかるように、それぞれデバッグ用とリリース用になっています。Web.config をベースとして、Web.Debug/Release.config の値を反映させる形になりますが、基本的な変換については既にコメント化されて用意されています。

詳しい解説は以下のように MSDN に用意されていますが、今回は実際のファイルを確認してみます。
Web アプリケーション プロジェクト配置の Web.config 変換構文

Web.Release.config

<?xml version="1.0" encoding="utf-8"?>

<!-- web.config 変換の使用方法の詳細については、http://go.microsoft.com/fwlink/?LinkId=125889 を参照してください -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    次の例では、"MyDB" という値を持つ "name" 属性が "Match" ロケーターで
    見つかった場合にのみ、"SetAttributes" 変換によって "connectionString" の
    値が "ReleaseSQLServer" を使用するように変更されます。
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      次の例では、web.config ファイルの <customErrors> セクション全体が 
      "Replace" 変換によって置き換えられます。
      <system.web> ノードには customErrors セクションが 1 つしかないため、
      "xdt:Locator" 属性を使用する必要はありません。
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

基本的にはいつも通り Web.config のフォーマットで書いていくのですが、変更したい項目だけを追加するところが異なっています。そして xdt:Transform と xdt:Locator という属性が付いていますが、この 2 つの属性で変換方法と変換対象の要素を決定します。

既にコメントとしてよく使われるであろう定義と説明が書かれているので、コメントを外して値を少し修正するだけで使えるようになっています。これはリリース用のファイルなので、接続文字列を ReleaseSQLServer へ変更して compilation の debug 属性を削除するようになっていますが、例えばローカルでは SQL Compact Edition 4.0 を使っているけど、本番では SQL Server を利用したいといった場合は、接続文字列を変更するだけで簡単に対応できますね。

Web.config の変換を使うことでリリース用の設定反映を手動でやる必要がなくなりましたが、この設定が反映されるのは Web 発行を行った時なので IIS 7.5 Express などを使ってローカルで開発している時に反映させるためには Web.config に書く必要があるので注意が必要です。

次回は Web 発行のプロファイルを作成して、実際に ExpressWeb へ反映させる手前まで行っていきたいと思います。お疲れ様でした。