- PR -

Web.Configの情報を取得する方法

1
投稿者投稿内容
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-07-23 10:30
ぷーちんです。いつもお世話になっております。

VB.NETでWebサービスを作成しています。

Grobal.asaxで、Web.Configの設定内容を取得しようとしていますが、
appSettingsから取得するのはできても、それ以外に作った設定情報ができません。

appSettingsを使って以下のように設定した場合

<appSettings>
<add key="loginuser" value="aaa"></add>
<add key="loginpwd" value="bbb"></add>
</appSettings>

下のような方法で簡単に設定内容を取得することができます。

Dim app As New System.Configuration.AppSettingsReader()
Dim strBuff As String
strBuff = app.GetValue("ftpuser", GetType(String))
strBuff = app.GetValue("ftppwd", GetType(String))


ですが、できれば関連のものは、ひとまとめにして設定したいと思い、
以下のように設定してみました。

<login user = "aaa" pwd= "bbb" />

しかし、この設定した内容を取得する方法がわかりません。
普通は、appSettingsしか使わないものですか?
取得する方法があれば教えてください。

よろしくお願い致します。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-07-23 10:33
任意のXMLを利用したいなら、Web.Configではなく、任意の名前のファイルを使用すればいいのではないでしょうか。
(ファイル名をappSettingsに書いておくといいかも)
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-23 14:14
SingleTagSectionHandler とかではどうでしょう?
構成セクションとかカスタム構成セクションとかで
ドキュメントを検索すればどこかにサンプルが出てると思います。
FOX
ベテラン
会議室デビュー日: 2002/04/08
投稿数: 63
お住まい・勤務地: いなか
投稿日時: 2003-07-23 16:11
引用:

SingleTagSectionHandler とかではどうでしょう?
構成セクションとかカスタム構成セクションとかで
ドキュメントを検索すればどこかにサンプルが出てると思います。



こんな機能があったとは……。勉強になります。
自前のハンドラも使えるようですね。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-07-23 16:32
私も知りませんでした。
で、やってみました。

コード:
Web.configのconfiguration内
<configSections>
  <section name="login" type="System.Configuration.SingleTagSectionHandler,
 System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
<login user="aaa" pwd="bbb" />


コード内で
Hashtable h = (Hashtable)Context.GetConfig("login");
とすると、属性の名称と値のペアがとれます。
注意点
・SingleTagSectionHandlerの後ろのカンマ以降は不要かもしれません。
私の環境では、1.0と1.1を入れているためか必要でした。
・loginノードは1つしか書けません。

ということで、子ノードを持たせるようにするには、以下のような自前のハンドラが必要なようです。
コード:
Web.configのconfiguration内
<configSections>
  <section name="login" type="MyHandler,WebApplication1"/>
</configSections>
<login>
  <user name="aaa" pwd="bbb" />
  <user name="ccc" pwd="ddd" />
</login>

csファイル
public class MyHandler : System.Configuration.IConfigurationSectionHandler
{
	public object Create(object parent, object configContext, System.Xml.XmlNode section)
	{
		Hashtable ht = new Hashtable();
		foreach (System.Xml.XmlNode nd in section.ChildNodes)
			ht[nd.Attributes["name"].Value] = nd.Attributes["pwd"].Value;
		return ht;
	}
}



なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-23 16:52
引用:

注意点
・SingleTagSectionHandlerの後ろのカンマ以降は不要かもしれません。
私の環境では、1.0と1.1を入れているためか必要でした。
・loginノードは1つしか書けません。

ということで、子ノードを持たせるようにするには、以下のような自前のハンドラが必要なようです。


<sectionGroup> 要素あたりも調べると良いかも。

セクションハンドラの自作はちょっと注意点がありますので、
そのまま使えるんであれば用意されているものの方が無難です。

# 別に特別難しいというわけではありませんが。
# ある程度複雑になったり機能が足りなければ自作するのもいいと思います。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-23 17:18
引用:

<sectionGroup> 要素あたりも調べると良いかも。


ごめんなさい、上で書かれているような用途(同じタグが同位置に複数)には、
SingleTagSectionHandlerは使えないですね。
上記は、単にセクションをグループ化したい場合の話でした。
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-08-07 17:20
ぷーちんです。いつもお世話になっております。
返事が遅くなりましたが、
catsさんが言われる通り、自前のハンドラを作って取得できるようになりました。
みなさん、どうもありがとうございました。今後ともよろしくお願い致します。

こんな感じでうまくいきました。

Web.configの内容
------------------------------------------------
<configuration>

<configSections>
 <section name="TestSettings" type = "TestSectionHandler, TestSectionHandlerのアセンブリ名" />
</configSections>

<TestSettings>
 <login user = "aaa" pwd= "bbb" />
</TestSettings>

<system.web>
以降省略

追加項目を取得する新しいクラス
-----------------------------------------------
Public Class TestSectionHandler
 Implements IConfigurationSectionHandler

 '構成ファイルの情報保持
 Protected Shared nodeConfigSection As System.Xml.XmlNode

 'IConfigurationSectionHandler で実装が必要なメソッド
 Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
  If configContext Is Nothing Then
   Trace.Write("configContext is nothing.")
   Exit Function
  End If
  If section Is Nothing Then
   Trace.Write("section is nothing.")
   Exit Function
 Else
   nodeConfigSection = section.Clone()
  End If
 End Function

 '属性値を取得
 Public Shared Function GetInfo(ByVal strAttribute As String, ByVal strItem As String) As String

  Dim xmlNode As Xml.XmlNode = nodeConfigSection.SelectSingleNode(strAttribute)

  '構成がない
  If xmlNode Is Nothing Then
   Return Nothing
  End If

  '項目がない
  If xmlNode.Attributes(strItem) Is Nothing Then
   Return Nothing
  End If

  Return xmlNode.Attributes(strItem).Value.ToString
 End Function
End Class
1

スキルアップ/キャリアアップ(JOB@IT)