.NET TIPS

[ASP.NET]構成ファイルにカスタムの設定項目を追加するには?

山田 祥寛
2004/01/23

 ASP.NETの構成ファイル(web.config)には、ASP.NETの各種挙動を詳細に制御するための多くのパラメータが用意されており、それらにはデフォルトの値が設定されている。恐らく多くのユーザーが、デフォルトの構成で十分に要件を満たすことができるはずである。

 しかし、例えば以下のようなケースではどうだろう。

 データベース接続文字列のように、アプリケーション配下のほとんどのaspxファイル(拡張子が「.aspx」のファイル)から共通して利用される情報があった場合、これを個々のファイルに重複して記述することは好ましくない。接続先のデータベース・サーバやユーザーID/パスワードに変更があった場合、それぞれのaspxファイルに影響が及ぶためである。アプリケーションの規模が大きくなれば、当然、修正の漏れや間違いも発生しやすくなるし、また修正にかかる工数が原因でサーバを移行できないともなれば、なんとも本末転倒な話である。

 このような独自の項目を管理するために、構成ファイルでは独自の設定パラメータを追加することができる。これは、Global.asaxの静的変数やApplication_OnStartイベントによる記述を利用することでも可能だが、設定パラメータを編集する人間が「必ずしもASP.NETを理解していない」ことを想定すると、プログラム・ソース(Global.asax)を直接いじらせるよりも、XMLファイルである構成ファイルで変更できるようにしておく方がより好ましい。

 構成ファイルで追加パラメータを定義するには、以下のようにすればよい。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <appSettings>
    <add key="ConnectString" value="Provider=SQLOLEDB;Persist Security Info=True;Password=sa;User ID=sa;Initial Catalog=netinsider;Data Source=(local)" />
  </appSettings>
</configuration>
追加パラメータを定義する構成ファイル(web.config)
データベース接続文字列をカスタムの設定パラメータとして追加している。

 <appSettings>要素は、カスタムのアプリケーション・パラメータを定義するための要素で、上記例のように<add>要素によって任意のパラメータを追加することができる。key、value属性は、いずれも<add>要素を指定する際には必須の属性だ。もしも複数の追加パラメータを設定したい場合には、<appSettings>要素配下に複数の<add>要素を併記すればよい。

 <appSettings>要素で設定したカスタム・パラメータにアクセスするためには、ConfigurationSettingsクラス(System.Configuration名前空間)のstaticな(VB.NETではSharedな)AppSettingsプロパティを使用すればよい。

// custcfg_cs.aspx(C#)

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Configuration" %>
<script runat="Server">
void Page_Load(Object sender, EventArgs e){
  if (!Page.IsPostBack) {
    SqlConnection objDb = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
    objDb.Open();
    // 中略
    objDb.Close();
  }
}
</script>
<appSettings>要素で設定したカスタム・パラメータにアクセスする記述例(C#)
ConfigurationSettingsクラスのAppSettingsプロパティから、<appSettings>要素で設定したカスタム・パラメータにアクセスできる。
 
' custcfg_vb.aspx(Visual Basic .NET)

<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Configuration" %>
<script runat="Server">
Sub Page_Load(sender As Object, e As EventArgs)
  If Not Page.IsPostBack Then
    Dim objDb As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
    objDb.Open()
    ' 中略
    objDb.Close()
  End If
End Sub
</script>
<appSettings>要素で設定したカスタム・パラメータにアクセスする記述例(VB.NET)
ConfigurationSettingsクラスのAppSettingsプロパティから、<appSettings>要素で設定したカスタム・パラメータにアクセスできる。

 ここでは、データベース接続文字列を例に取って説明したが、リソース名(パス名)、XML Webサービスのエンドポイントなど、アプリケーション共通の情報を構成ファイルで管理することが、保守性の観点からも好ましいことはご理解いただけると思う。

 ちなみに、<appSettings>要素によるカスタム・パラメータの定義は、file属性を用いることで外部ファイル化することもできる。例えば、上の例を外部ファイルを利用して書き直してみると、以下のように記述することができる。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <appSettings file="custom.config" />
</configuration>
外部ファイルを利用する構成ファイル(web.config)
<appSettings>要素のfile属性を指定すると、その内容を外部ファイルで記述できる。

 file属性で指定したファイル(ここではcustom.config)の内容は次のようになる。

<?xml version="1.0" encoding="UTF-8" ?>
<appSettings>
  <add key="ConnectString" value="Provider=SQLOLEDB;Persist Security Info=True;Password=sa;User ID=sa;Initial Catalog=netinsider;Data Source=(local)" />
</appSettings>
カスタム・パラメータを設定した外部ファイル(custom.config)
この外部ファイル(custom.config)が構成ファイル(web.config)から利用される。

 外部ファイル化に際しては、注意すべき点が2点ある。

(1)外部ファイルのルート要素は<appSettings>要素

 外部ファイル化した場合にも、<add>要素を直接に記述することはできないので、注意が必要だ。<add>要素の個数にかかわらず、全体を唯一の<appSettings>要素で囲む必要がある。

(2)外部ファイルの拡張子は「.config」

 実は、外部ファイルの拡張子は必ずしも決まっていない。例えば、「custom.xml」のように拡張子を「.xml」にしても「構文的には」間違いではない。

 しかし、にもかかわらず、「.config」以外の拡張子を利用するのが好ましくないのはなぜか。それは「.config」以外の拡張子を使用した場合、外部化した設定ファイルがWebブラウザから直接に参照できてしまうためだ。

外部ファイルの拡張子が「.xml」の場合のブラウザ参照
外部設定ファイルの名前が「custom.xml」の場合、拡張子が「.xml」なので通常のXMLファイルと同じように扱われるため、Webブラウザで自由に参照できてしまう。
 
外部ファイルの拡張子が「.config」の場合のブラウザ参照
外部設定ファイルの名前が「custom.config」の場合、拡張子が「.config」なので構成ファイルと同じように扱われ、Webブラウザから直接にアクセスすることはできない。

 今回の例のように、ファイル内にデータベースへの接続情報が含まれている場合、これはパスワード漏えいの致命的なセキュリティ・ホールになってしまう。もちろん、設定ファイルには必ずしもセキュリティに属する値が記述されているわけではないが、多くがアプリケーション内部でのみ使用するシステム情報を記述していることを考えると、基本的には常にユーザーには見えない状態にしておくべきだろう。よって、外部ファイルの拡張子は「.config」を使用するのが好ましい。End of Article

カテゴリ:Webフォーム 処理対象:構成ファイル
使用キーワード:<appSettings>要素
使用ライブラリ:ConfigurationSettingsクラス(System.Configuration名前空間)
 
この記事と関連性の高い別の.NET TIPS
アプリケーション設定を活用するには?
[ASP.NET]特定のサービスを無効にするには?
[ASP.NET]アプリケーション個別の構成ファイルの変更を禁止するには?
Windowsフォームで構成ファイルによりプロパティ値を設定するには?
[ASP.NET].htmlや.pdfファイルをフォーム認証やロギングの対象にするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間