Web.Configにカスタムセクションを追加する
開発環境: Visual Studio 2005
1.目次
2.目的
3.参考書
4.作成手順
4.1 Web.Config
4.2 コンフィグレーションセクションハンドラの実装
5.利用方法
ASP.NET 2.0で、Web.Configに独自のカスタムセクションを追加する方法について。
ASP.NET 1.0,
1.1では、IConfigurationSectionHandlerインターフェイスを使用していましたが、ASP.NET
2.0では、ConfigurationSection クラスを使用します。
- MSDN: IConfigurationSectionHandler インターフェイス
-
MSDN:
ConfigurationSection クラス
次のステップで作成します。
- Web.Config に Configuration Section ハンドラーを宣言する。
- Web.Config に カスタムコンフィグレーショングループを追加する。
- コンフィグレーションセクションハンドラー(dll)を実装する。
- Web.Configのディレクトリにdllを配置する。
まず、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> |
|
ソリューションに、クラスライブラリプロジェクトを追加し、ConfigurationSectionから継承したコンフィグレーションセクションハンドラの実体(MyCustomConfigurationHandler.cs)を実装します。このプロジェクトの出力(MyCustomConfigurationHandler.dll)は、Web.Config
があるディレクトリの下のbinディレクトリに格納します。
![Image](index.1.JPG)
注意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;
} } } }
使い方は簡単で、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](index.2.JPG)
| |