129

従来の ASP ページと ASP.NET ページが混在する Web サイトで使用されるデータ アクセス コンポーネントを開発しており、その構成設定を管理する適切な方法が必要です。

custom を使用したいのConfigurationSectionですが、ASP.NET ページの場合、これはうまく機能します。ただし、従来の ASP ページから COM 相互運用機能を介してコンポーネントが呼び出されると、コンポーネントは ASP.NET 要求のコンテキストで実行されないため、web.config を認識しません。

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

これに対する他のアプローチは大歓迎です!

4

9 に答える 9

129

これを試して:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
于 2008-08-07T14:14:44.187 に答える
72

もう 1 つの解決策は、デフォルトの環境構成ファイル パスをオーバーライドすることです。

自明でないパス構成ファイルのロード、特に構成ファイルを dll にアタッチするための最良の方法に最適なソリューションだと思います。

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

例:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

詳細については、このブログを参照してください。

さらに、この他の回答には優れたソリューションがあり、アプリの構成を更新するコードと、IDisposable元の状態にリセットするオブジェクトを備えています。このソリューションを使用すると、一時的なアプリ構成のスコープを維持できます。

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}
于 2013-01-09T20:52:41.130 に答える
42

Ishmaeel の回答は一般的に機能しますが、1 つの問題が見つかりましたOpenMappedMachineConfiguration。これは、独自のカスタム セクション (必要なすべての OP) にアクセスできることを意味しますが、通常のシステム セクションにはアクセスできません。たとえば、次のコードは機能しません。

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

基本的に、 を監視すると、configuration.SectionGroupssystem.net が SectionGroup として登録されていないことがわかります。そのため、通常のチャネルからはほとんどアクセスできません。

これを回避するために私が見つけた2つの方法があります。1 つ目は、私が好まない方法ですが、システム セクション グループを 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 設計者が意図したとおりにこれらの関数を使用しているとは言えません。しかし、これは私にはうまくいくようです。

于 2010-09-29T02:52:01.277 に答える
10

Ishmaeel の回答に加えて、メソッドOpenMappedMachineConfiguration()は常にConfigurationオブジェクトを返します。したがって、ロードされたかどうかを確認するには、HasFileプロパティを確認する必要があります。 true は、ファイルからのものであることを意味します。

于 2008-08-08T14:04:32.857 に答える
4

次のように、word hosted.nETCompoentに構成値を提供しました。

MSWordで呼び出/ホストされている.NETクラスライブラリコンポーネント。コンポーネントに構成値を提供するために、C:\ Program Files \ Microsoft Office\OFFICE11フォルダーにwinword.exe.configを作成しました。従来の.NETの場合と同じように、構成値を読み取ることができるはずです。

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
于 2010-11-11T18:38:54.967 に答える
1

ASP.NET の場合、WebConfigurationManager を使用します。

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
于 2014-07-14T20:43:22.873 に答える
0

XML 処理を使用します。

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)
于 2016-02-08T22:18:57.280 に答える