私は、古典的な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);
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 にコピーして再実装する方法です。
<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</sectionGroup>
その後、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設計者が意図した通りにこれらの機能を使用しているとは言い難いことを敢えて指摘しておきます。しかし、私はこれでうまくいきそうです。
Ishmaeel' の回答に加えて、OpenMappedMachineConfiguration()
メソッドは常に Configuration
オブジェクトを返します。ですから、ロードされたかどうかを確認するには、HasFile
プロパティをチェックする必要があります。