ConfigurationManagerを使用して、任意の場所から設定を読み込む

私は、古典的なASPとASP.NETページが混在するウェブサイトで使用されるデータアクセスコンポーネントを開発しており、その構成設定を管理する良い方法が必要です。

カスタムConfigurationSectionを使いたいのですが、ASP.NETのページでは、これはとてもうまくいきます。 しかし、コンポーネントが古典的なASPページからCOMインタロップを介して呼び出された場合、コンポーネントはASP.NETリクエストのコンテキストで実行されていないため、web.configの知識を持っていません。

ConfigurationManagerに、任意のパス (例えば、アセンブリが/binフォルダにある場合は..\web.config) から設定をロードするように指示する方法はありますか? もし、そうであれば、私のコンポーネントは、デフォルトのConfigurationManager.GetSectionが私のカスタムセクションに対してnull` を返した場合、それにフォールバックすることができると考えています。

この件に関して他のアプローチがあれば、歓迎します。

ソリューション

これを試してみてください。

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
解説 (3)

Ishmaeel'の回答は概ねうまくいくのですが、1つだけ問題を見つけました。それは、OpenMappedMachineConfigurationを使うと、machine.configから継承したセクショングループが失われるようなのです。つまり、カスタムセクションにはアクセスできるけれども、通常のシステムセクションにはアクセスできないということです(これはOPが望んでいたことです)。例えば、以下のコードは動作しません。

ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null

基本的に、configuration.SectionGroupsをウォッチすると、system.netはSectionGroupとして登録されていないので、通常のルートではほとんどアクセスできないことがわかります。

これを回避する方法は2つありました。一つ目は、私は好きではありませんが、システムのセクショングループを machine.config から自分の web.config にコピーして再実装する方法です。



    <section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

その後、Webアプリケーション自体が正しく実行されるかどうかは分かりませんが、sectionGroupsに正しくアクセスすることができます。

2つ目の解決策は、web.configをEXEコンフィギュレーションとして開くことで、おそらくその意図する機能に近いものになります。

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns valid object!

ここで提供されたどの回答も、私もIshmaeel'も、.NET設計者が意図した通りにこれらの機能を使用しているとは言い難いことを敢えて指摘しておきます。しかし、私はこれでうまくいきそうです。

解説 (1)

Ishmaeel&#39 の回答に加えて、OpenMappedMachineConfiguration() メソッドは常に Configuration オブジェクトを返します。ですから、ロードされたかどうかを確認するには、HasFile プロパティをチェックする必要があります。

解説 (0)