web-dev-qa-db-ja.com

ConfigurationManager.RefreshSectionを使用してアプリケーションを再起動せずに構成を再読み込みする

誰かがこれをWebアプリケーションで機能させていますか?

私が何をしても、私のappSettingsセクション(appSettings file = "。\ Site\site.config"を使用してweb.configからリダイレクト)がリロードされないようです。

アプリケーションを再起動するだけで済むのではないでしょうか。この方法がより高性能なソリューションにつながることを期待していました。

更新:

「リロード」とは、ASP.NETアプリケーションを完全に再起動する必要がなく、通常の起動待ち時間が発生することなく、ConfigurationManager.AppSettingsを更新することを意味します。

39
Kieran Benton

正しい 大文字と小文字を区別 の値をRefreshSectionに渡していることを確認してください。

ConfigurationManager.RefreshSection("appSettings");
49
G-Wiz

AppSettingsに外部設定ファイルを使用する場合、これは欠陥(おそらくバグ)のようです。 configSource属性を使用して試してみましたが、RefreshSectionはまったく機能しません。これは、file属性を使用する場合も同じであると想定しています。 appSettingsをweb.config内に戻した場合、RefreshSectionは完全に機能しますが、それ以外の場合は運命にあると思います。

14
Adam

何らかの理由でConfigurationManager.RefreshSection("appSettings")が機能しませんでした。 Web.ConfigをConfigurationオブジェクトに再読み込みすると、正常に動作するようです。次のコードは、Web.Configファイルが実行中の(bin)フォルダーの下の1つのディレクトリであることを前提としています。

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
string appPath = uriAssemblyFolder.LocalPath;
configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

そして、次のように使用されます:

string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value;
4

別の方法として、独自のConfigSectionを記述して_restartOnExternalChanges="false"_を設定することもできます。

次に、ConfigurationManager.GetSection("yourSection")でセクションを読み取ると、設定はアプリケーションを再起動せずに自動更新になります。

また、厳密に型指定された設定またはNameValueCollectionとして設定を実装できます。

3
Martin Meixger

appSettingsが外部の場合、.RefreshSection()は機能しません。

ただし、以下を使用して値を変更できます。

ConfigurationManager.AppSettings.Set(key, value)

これはファイルの設定を変更せず、メモリにロードされた値のみを変更します。

したがって、RefreshSectionを使用する代わりに、次のことを行いました。

string configFile="path to your config file";
XmlDocument xml = new XmlDocument();
xml.Load(configFile);

foreach (XmlNode node in xml.SelectNodes("/appSettings/add"))
{
    string key = node.Attributes["key"].Value;
    string value= node.Attributes["value"].Value;
    ConfigurationManager.AppSettings.Set(key, value);
}

その後のAppSettings.Getの呼び出しには、更新された値が含まれます。

その後、アプリケーションを再起動する必要なく、appSettingsが更新されます。

2
Allie

はい。 iisの再起動で立ち往生しています。

Asp.net 4.0およびiis 7.5には、最初の起動が削除された機能があります。

0
yamspog

これがWebアプリで可能かどうかはわかりませんが、デスクトップアプリでは機能します。 ConfigurationManagerではなくConfigurationSettingsを使用してみてください(古いクラスを使用すると怒鳴ります...)、すべてのデータをクラスに読み込みます。更新したい場合は、新しいインスタンスを作成し、古いインスタンスへのすべての参照を削除します。これが機能する理由についての私の理論(間違っている可能性があります):実行中ずっとapp.configファイルに直接アクセスしないと、アプリケーションによってファイルロックが解除されます。その後、ファイルにアクセスしていないときに編集を行うことができます。

0
badpanda