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


84

実行時にweb.configappSettings値を変更する方法について混乱しています。たとえば、次の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ファイルを編集する必要がなくなり、怒ったユーザーから電話がかかってきます。


これは、実行時にweb.configを変更することと、アプリケーションへの影響についてうまく説明している優れたリンクです。http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html

5
@ user330004指定したリンクは無効になりました
McArthey 2013

アーカイブされたバージョンを見つけるのに数秒しかかかりません!
stuartd 2017

回答:


84

使用する必要があります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またはNETWORKSERVICESModifyアクセスを許可する必要がある場合があります。


1
応答ミッチをありがとう。あなたは私の質問に答えました。私がしたことは、管理者としてVS 2008を実行し、すべてが正常に機能していたことです。
jerbersoft 2009

おそらく他の人には明らかですが(私にはわかりませんでした)、この回答と、機能的に同じAminは、実際に物理的なweb.configファイルを上書きし、特定の実行中のインスタンスのメモリ内の設定を上書きするだけではありません。
k3davis

24

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

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


1
こんにちは、返信ありがとうございます。しかし、「保存」機能を持つこの「構成」クラスがあります。新しい設定をアクティブにするには、本当にアプリを再起動する必要がありますか?
jerbersoft 2009

4
web.configを変更すると、アプリケーションの再起動が自動的にトリガーされます。
マイクコール

1
web.configを動的に変更することはお勧めしません。値を(xml)ファイルに保存したいと思います。
Deepak Mishra 2014年

誰かがアプリケーションの再起動が悪い理由を説明でき、多くの人が属性を別のファイルに移動することをお勧めしますか?
ベン

1
@ Ben-数か月経ちましたが、念のため-アプリを再起動すると、再起動時にアプリにログインしているユーザーは自動的にログアウトされ、エラーが発生する可能性が高くなります。(Webファームなどのさまざまなシナリオにもかかわらず...)。怒っているユーザーはサポートに連絡し、サポートはあなたに連絡しますなど...
Fetchez lavache18年

24

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

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

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

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

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


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();

なぜそれが優れているのか、少し詳しく説明していただけますか?私はconfigSectionのものが時々少しトリッキーであることを知っています。
julealgon 2013

1
このコードはより小さく、より理解しやすいです!少なくとも私にとっては。
アミンガデリ2013

3
ああ、それは個人的な趣味のせいで、実はどういうわけか論理的に違うと思いました。この場合、実際には多くの理由であなたに非常に同意しません。最初は同じキーを2回指定する必要があるため、2番目は実際に必要なものと意味的に異なるためです(「更新」と「削除」-> ')と3番目を追加します。これは、コードが実際には長く(なぜここで他のことをするのかわからない)、間違いを犯しやすいためです。また、何らかの理由でコードが呼び出しの間に失敗した場合はどうなりますか?あなたのアプリケーションはそこから壊れていると思います。
julealgon 2013

2
このコードは、MyVariableの兄弟であるコメントをすべて消去します。
blagus 2016年

はい、正確に !このコードコードはすべての変数を書き直しますが、機能します。しかし、コメントコードを使用した場合は、使用することをお勧めしません。ありがとうございました。
アミンガデリ2017年

14

この質問は古いことは知っていますが、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のリサイクルが発生した場合、イベントログエントリが記録されているはずですが、記録されていません。

これにより、一元化されたストレージメディアからアプリケーション設定をロードすることが可能であり、実際に安全であると結論付けることができます。

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


これはおそらく私に数時間を節約しました。本当にありがとう!
ドリューデラノ2017年

4

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

あなたの構成で

    <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();

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();
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.