web-dev-qa-db-ja.com

実行時にweb.config appSettingsをどのように変更しますか?

実行時にweb.config appSettings値を変更する方法について混乱しています。たとえば、次のappSettingsセクションがあります。

<appSettings>
  <add key="productspagedesc" value="TODO: Edit this default message" />
  <add key="servicespagedesc" value="TODO: Edit this default message" />
  <add key="contactspagedesc" value="TODO: Edit this default message" />
  <add key="aboutpagedesc" value="TODO: Edit this default message" />
  <add key="homepagedesc" value="TODO: Edit this default message" />
 </appSettings>

実行時に「homepagedesc」キーを変更したいとしましょう。 ConfigurationManagerとWebConfigurationManagerの静的クラスを試しましたが、設定は「読み取り専用」です。実行時にappSettings値を変更するにはどうすればよいですか?

更新:わかりましたので、ここで私は5年後です。経験から、web.configファイルに実行時に意図的に編集可能な構成を配置するのではなく、ユーザーの1人がコメントしたとおりに別のXMLファイルに配置する必要があることを指摘したいと思います。アプリを再起動するためにweb.configファイルを編集する必要はありません。これにより、怒っているユーザーが電話をかけることになります。

83
jerbersoft

WebConfigurationManager.OpenWebConfiguration()を使用する必要があります:例:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text
myConfiguration.Save()

Machine.configで AllowLocation を設定する必要があるかもしれません。これは、要素を使用して個々のページを構成できるかどうかを示すブール値です。 「allowLocation」がfalseの場合、個々の要素で構成できません。

最後に、アプリケーションをIISで実行し、Visual Studioからテストサンプルを実行すると、違いが生じます。ASP.NETプロセスIDは、IISアカウント、ASPNETまたはNETWORK SERVICES(IISバージョンに依存)。

ASP.NETまたはNETWORK SERVICESにweb.configが存在するフォルダーの変更アクセスを許可する必要がある場合があります。

83
Mitch Wheat

通常、web.configを変更すると、アプリケーションが再起動します。

アプリケーションで独自の設定を編集する必要がある場合は、設定のデータベース化や編集可能な設定でxmlファイルを作成するなど、別のアプローチを検討する必要があります。

24
Joel

また、アプリケーションの再起動を避けたい場合は、appSettingsセクションを削除できます。

<appSettings configSource="Config\appSettings.config"/>

別のファイルに。 ConfigurationSaveMode.Minimalと組み合わせて

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.Save(ConfigurationSaveMode.Minimal);

アプリケーションを再起動せずに、通常のappSettingsセクションとは異なる形式のファイルを使用する必要なく、さまざまな設定のストアとしてappSettingsセクションを引き続き使用できます。

23

2012これは、このシナリオのより良いソリューションです( Visual Studio 2008 でテスト済み):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
config.AppSettings.Settings.Remove("MyVariable");
config.AppSettings.Settings.Add("MyVariable", "MyValue");
config.Save();

2018年に更新=>
2015年にテスト済み-Asp.net MVC5

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
config.Save();

要素の存在を確認する必要がある場合は、次のコードを使用します:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
if (config.AppSettings.Settings["MyVariable"] != null)
{
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
}
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); }
config.Save();
20
Amin Ghaderi

この質問は古いことはわかっていますが、ASP.NET\IISの世界の現状と私の実世界での経験を組み合わせた回答を投稿したかったのです。

最近、会社でプロジェクトを率いて、web.configファイル内のすべてのappSettingsおよびconnectionStrings設定を1か所に統合​​して管理したいと考えました。プロジェクトの成熟度と安定性のために、構成設定がZooKeeperに保存されるアプローチを追求したかったのです。 ZooKeeperが設計および構成を管理するアプリケーションであることは言うまでもありません。

プロジェクトの目標は非常にシンプルでした。

  1. aSP.NETを取得してZooKeeperと通信する
  2. global.asaxのApplication_Start-ZooKeeperからweb.config設定をプルします。

ASP.NETがZooKeeperと通信するための技術的な部分を通過すると、すぐに次のコードを見つけて壁にぶつかりました。

ConfigurationManager.AppSettings.Add(key_name, data_value)

AppSettingsコレクションに新しい設定を追加したかったので、このステートメントは最も論理的な意味を持ちました。ただし、元のポスター(および他の多くのポスター)が述べたように、このコード呼び出しは、コレクションが読み取り専用であることを示すエラーを返します。

少しの調査を行い、この問題を回避するためのさまざまなクレイジーな方法をすべて見てから、私は非常に落胆しました。理想的ではないシナリオと思われるものをあきらめるか解決する代わりに、私は掘り下げて何かが足りないかどうかを確認することにしました。

少し試行錯誤を重ねた結果、次のコードがまさに私が望んでいたことをすることがわかりました。

ConfigurationManager.AppSettings.Set(key_name, data_value)

このコード行を使用して、Application_StartでZooKeeperから85個のappSettingsキーをすべてロードできるようになりました。

IIS recyclesをトリガーするweb.configの変更に関する一般的なステートメントに関して、私は舞台裏の状況を監視するために次のappPool設定を編集しました。

appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True

この設定の組み合わせにより、このプロセスがappPoolのリサイクルを引き起こす場合、イベントログエントリは記録されているはずですが、記録されていません。

これは、集中ストレージメディアからアプリケーション設定をロードすることが可能であり、実際に安全であると結論付けることにつながります。

Windows 7でIIS7.5を使用していることに言及する必要があります。コードはWin2012でIIS8に展開されます。この回答に関する何かが変わった場合は、それに応じてこの回答を更新します。

12
Sage

ポイントに直接好きな人、

あなたの設定で

    <appSettings>

    <add key="Conf_id" value="71" />

  </appSettings>

あなたのコード(c#)

///SET
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue");
      ///GET              
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString();
3
mzonerz

これを試して:

using System;
using System.Configuration;
using System.Web.Configuration;

namespace SampleApplication.WebConfig
{
    public partial class webConfigFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Helps to open the Root level web.config file.
            Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~");
            //Modifying the AppKey from AppValue to AppValue1
            webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString";
            //Save the Modified settings of AppSettings.
            webConfigApp.Save();
        }
    }
}
0
Code Alumni