87

実行時に 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 ファイルを編集する必要がなくなり、怒っているユーザーから電話がかかってきます。

4

7 に答える 7

85

使用する必要があります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 のバージョンによる) です。

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

于 2009-04-06T00:26:12.703 に答える
25

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

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

于 2009-04-06T00:22:19.060 に答える
24

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

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

別ファイルに。そして組み合わせでConfigurationSaveMode.Minimal

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

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

于 2014-12-11T13:32:42.090 に答える
21

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.netMVC5

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();
于 2012-08-08T06:31:36.363 に答える
16

この質問が古いことは承知していますが、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 リサイクルをトリガーする 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 に展開されます。この回答に関する変更があった場合は、それに応じてこの回答を更新します。

于 2016-06-06T12:46:51.510 に答える
0

これを試して:

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();
        }
    }
}
于 2017-06-27T11:20:12.150 に答える