ConfigurationManager を使用して任意の場所から構成をロードする
-
08-06-2019 - |
質問
従来の ASP ページと ASP.NET ページが混在する Web サイトで使用されるデータ アクセス コンポーネントを開発しており、その構成設定を管理する適切な方法が必要です。
カスタムを使用したい ConfigurationSection
, 、ASP.NET ページの場合、これはうまく機能します。ただし、コンポーネントがクラシック ASP ページから COM 相互運用経由で呼び出される場合、コンポーネントは ASP.NET 要求のコンテキストで実行されないため、web.config の知識がありません。
伝える方法はありますか ConfigurationManager
任意のパスから設定をロードするだけです (例: ..\web.config
私のアセンブリが /bin
フォルダ)?存在する場合、デフォルトの場合、コンポーネントはそれにフォールバックできると思います ConfigurationManager.GetSection
戻り値 null
私のカスタムセクション用。
これに対する他のアプローチは大歓迎です。
解決
これを試して:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
他のヒント
別の解決策は、デフォルトの環境構成ファイルのパスをオーバーライドすることです。
これは、重要なパスの構成ファイルの読み込みに対する最良の解決策、特に構成ファイルを DLL に添付する最良の方法であると思います。
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
例:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
詳細については、次の URL を参照してください。 このブログ.
さらに、 この他の答え アプリの構成を更新するためのコードを備えた優れたソリューションがあり、 IDisposable
オブジェクトを元の状態にリセットします。このソリューションを使用すると、一時的なアプリの構成をスコープしておくことができます。
using(AppConfig.Change(tempFileName))
{
// tempFileName is used for the app config during this context
}
Ishmael の答えは通常は機能しますが、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 つあります。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!
あえて言えば、ここで提供された回答は、私の回答もイシュマエルの回答も、.NET 設計者が意図したとおりにこれらの関数をまったく使用していません。しかし、これは私にとってはうまくいくようです。
イシュマエルの答えに加えて、メソッド OpenMappedMachineConfiguration()
常に を返します Configuration
物体。したがって、ロードされているかどうかを確認するには、 HasFile
プロパティ。 true はファイルから取得されたことを意味します。
次のように、word hosted .nET Component に構成値を指定しました。
MS Word で呼び出される/ホストされる .NET クラス ライブラリ コンポーネント。コンポーネントに構成値を提供するために、C:\Program Files\Microsoft Office\OFFICE11 フォルダーに winword.exe.config を作成しました。従来の .NET と同様に構成値を読み取ることができるはずです。
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
受け入れられた答えは間違っています!!
AppSettings プロパティにアクセスすると、次の例外がスローされます。
'System.Configuration.DefaultSection' 型のオブジェクトを 'System.Configuration.AppSettingsSection' 型にキャストできません。
正しい解決策は次のとおりです。
System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
ASP.NET の場合は、WebConfigurationManager を使用します。
var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
XML 処理を使用します。
var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);
// can call root.Elements(...)
これでうまくいくはずです:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);
ソース : https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files