C# Programming

ImageWeb.Configにカスタムセクションを追加する           

開発環境: Visual Studio 2005

1.目次

1.目次
2.目的
3.参考書
4.作成手順
  4.1 Web.Config
  4.2 コンフィグレーションセクションハンドラの実装
5.利用方法

2.目的

ASP.NET 2.0で、Web.Configに独自のカスタムセクションを追加する方法について。

ASP.NET 1.0, 1.1では、IConfigurationSectionHandlerインターフェイスを使用していましたが、ASP.NET 2.0では、ConfigurationSection クラスを使用します。

3.参考書

  1.  MSDN: IConfigurationSectionHandler インターフェイス
  2. MSDN: ConfigurationSection クラス

4.作成手順

次のステップで作成します。

  1. Web.Config に Configuration Section ハンドラーを宣言する。
  2. Web.Config に カスタムコンフィグレーショングループを追加する。
  3. コンフィグレーションセクションハンドラー(dll)を実装する。
  4. Web.Configのディレクトリにdllを配置する。

4.1 Web.Config

まず、Configuration Section Handler を宣言し、特定の名前のセクションがWeb.Config に現れた場合に呼び出すハンドラ(dll)を指定します。ここでは、Web.Config に次の行を追加します。Web.Configは、ケースセンシティブなので注意します。

  <configSections>
    <
sectionGroup name="myCustomGroup">
      <
section name="myCustomSection"
                  
type="MyConfigSectionHandler.MyHandler,
                             MyCustomConfigurationHandler
"/>
    </
sectionGroup>
  </
configSections>

注意1
typeは、type="Fully qualified class name, assembly file name, version, culture, public key token" を指定します。Culture, PublicKeyTokenは省略可能です。

例: type="MyConfigSectionHandler.MyHandler,   
      MyCustomConfigurationHandler,
      Version=1.0.0.0, 
      Culture=neutral, 
      PublicKeyToken=null"

次に、ハンドラが読み込むカスタムセクションを定義します。Web.Configファイルに次のようにカスタムコンフィグレーショングループ (myCustomGroup)を追加します。このmyCustomGroupには、myCustomSectionとして、3つの属性(fileName: String型、maxUsers: Integer型、 maxIdleTime: TimeSpan型、さらにその子供のセクションとして myChildSection)を定義します。これは<configSections> ブロック以降である必要があります。

  <!-- 追加したカスタムコンフィグレーショングループ -->
  <
myCustomGroup>
    <
myCustomSection fileName="test.html" maxUsers="12" maxIdleTime="0:55:34">
      <
myChildSection myChildAttrib1="uchukamen" myChildAttrib2="csharp"/>
    </
myCustomSection>
  </
myCustomGroup>

Web.Config
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <!-- Configuration 
				section handler を宣言する -->
  <configSections>
    <sectionGroup name="myCustomGroup">
     <section name="myCustomSection"
type="MyConfigSectionHandler.MyHandler,
MyCustomConfigurationHandler
"/>
</
sectionGroup> </configSections> <appSettings/> <system.web> <compilation debug="true"/> <authentication mode="Windows"/> </system.web> <!-- 追加したカスタムコンフィグレーショングループ -->
<
myCustomGroup>
<
myCustomSection fileName="test.html" maxUsers="12" maxIdleTime="0:55:34">
<
myChildSection myChildAttrib1="uchukamen" myChildAttrib2="csharp"/>
</
myCustomSection>
</
myCustomGroup> </configuration>

 

4.2 コンフィグレーションセクションハンドラの実装

ソリューションに、クラスライブラリプロジェクトを追加し、ConfigurationSectionから継承したコンフィグレーションセクションハンドラの実体(MyCustomConfigurationHandler.cs)を実装します。このプロジェクトの出力(MyCustomConfigurationHandler.dll)は、Web.Config があるディレクトリの下のbinディレクトリに格納します。

Image

 

注意2
アセンブリーファイルの配置場所の説明には、

The assembly file must be located in the same application directory as the Web.config file that defines it. In the case of the root Web.config or Machine.config file, the assembly file must be in the %SystemRoot%\Microsoft.NET\Framework\version directory.

という説明がありますが、Web.Config と同じディレクトリに置いても「CS0246: 型または名前空間名 'MyConfigSectionHandler' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」というエラーになり、認識してくれませんでした。bin の下に入れることにより、認識してくれます。説明が違っているような・・・

MyCustomConfigurationHandler.cs は次のとおりで、プロパティを宣言し、[ConfigurationProperty]アトリビュートで宣言します。

パラメータとしては、Integer型、String型、TimeSpan型などが使えます。必要に応じて、IntegerValidator などのValidator アトリビュートにより、入力審査を行うことができます。

MyConfigurationSectionHandler.cs

using System;
using System.Collections;
using System.Text;
using System.Configuration;

namespace MyConfigSectionHandler
{
  
public sealed class MyHandler : ConfigurationSection
    {

// 文字列
[ConfigurationProperty("fileName", DefaultValue = "Test.html", IsRequired = true)]
[
StringValidator(InvalidCharacters = " ~!@#$%^&*()[]{}/;'\"|\\", 
MinLength = 1, MaxLength = 60)]
public string FileName
{
  
get
  
{
       
return (string)this["fileName"];
  }
  
set
  
{
    
this["fileName"] = value;
  }
}

// 数値
[ConfigurationProperty("maxUsers", DefaultValue = 10, IsRequired = false)]
[
IntegerValidator(MinValue = 1, MaxValue = 100, ExcludeRange = false)]
public int MaxUsers
{
  
get
  
{
    
return (int)this["maxUsers"];
  }
  
set
  
{
    
this["maxUsers"] = value;
  }
}

// 時間間隔
[ConfigurationProperty("maxIdleTime")]
[
TimeSpanValidator(MinValueString = "0:0:0",
MaxValueString =
"1:23:45", ExcludeRange = false)]
public TimeSpan MaxIdleTime
{
   
get
   
{
       
return (TimeSpan)this["maxIdleTime"];
    }
   
set
   
{
       
this["maxIdleTime"] = value;
    }
}

// 子要素
[ConfigurationProperty("myChildSection")]
public ChildConfigElement MyChildSection
{
   
get
   
{ return (ChildConfigElement)this["myChildSection"]; }
   
set
   
{ this["myChildSection"] = value; }
}

}

public class ChildConfigElement : ConfigurationElement
{
    public ChildConfigElement()
    {}

    public ChildConfigElement(String a1, String a2)
    {
        MyChildAttribute1 = a1;
        MyChildAttribute2 = a2;
    }

    [ConfigurationProperty("myChildAttrib1", DefaultValue = "Hello",
        IsRequired =
true)]
    [
StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\",
        MinLength = 1, MaxLength = 60)]

    public String MyChildAttribute1
    {
       
get
        { return (String)this["myChildAttrib1"]; }
       
set
        { this["myChildAttrib1"] = value; }
    }

    [
ConfigurationProperty("myChildAttrib2", DefaultValue = "World",
        IsRequired =
true)]
    [
StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\",
        MinLength = 1, MaxLength = 60)]

    public String MyChildAttribute2
    {
       
get
            { return (String)this["myChildAttrib2"]; }
       
set
        { this["myChildAttrib2"] = value; }
    }
}
}

5.利用方法

使い方は簡単で、ConfiguratinManager.GetSection で呼び出したハンドラのプロパティに値がセットされてくるので、そのまま使用できます。

利用方法

protected void Button1_Click(object sender, EventArgs e)
{

MyConfigSectionHandler.MyHandler myHandler = (MyConfigSectionHandler.MyHandler)ConfigurationManager.GetSection("myCustomGroup/myCustomSection");

TextBox1.Text = "FileName: " + myHandler.FileName;
TextBox1.Text +=
"\nMaxUsers: " + myHandler.MaxUsers;
TextBox1.Text +=
"\nMaxIdleTime: " + myHandler.MaxIdleTime;

TextBox1.Text +=
"\n\nMyChildAttribute1: " +  myHandler.MyChildSection.MyChildAttribute1;

TextBox1.Text += "\nMyChildAttribute2: " + myHandler.MyChildSection.MyChildAttribute2;

}

実行例です。

Image