2009-04-06 11 views
73

実行時にweb.configのappSettings値を変更する方法が混乱します。実行時にweb.config 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」キーを変更したい、のは、言ってみましょう:例えば、私はこれのappSettingsセクションを持っています。私は、ConfigurationManagerとWebConfigurationManagerの静的クラスを試しましたが、設定は "読み取り専用"です。実行時にappSettingsの値を変更するにはどうすればよいですか?

更新日: だからここ5年後です。 Web.configファイルでは、実行時に意図的に編集できる設定を置いてはならないが、その代わりに、ユーザが以下にコメントしたものと同じ別のXMLファイルに入れておくべきであるという経験を指摘したい。これによりweb.configファイルを編集しなくてもアプリケーションを再起動することができ、怒っているユーザーがあなたを呼び出すことになります。

+0

をAでありますweb.configの変更についてうまく説明できる良いリンクランタイムとそのアプリケーションへの影響[http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html](http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at- runtime.html) –

+5

@ user330004あなたが提供したリンクはもはや有効ではありません – McArthey

+0

[アーカイブされたバージョン](http://web.archive.org/web/20111217082254/http://aspdotnethacker。 blogspot.com/2010/05/modify-webconfig-file-at-runtime.html)! – stuartd

答えて

75

あなたが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バージョンによって異なります)です。

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

+1

Mitchさんへの感謝。あなたは私の質問に答えました。私がしたことは、私がVS 2008を管理者として実行し、すべてがうまくいっていたことでした。 – jerbersoft

22

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

実際にアプリケーションで独自の設定を編集する必要がある場合は、設定をデータベース化するか、編集可能な設定でxmlファイルを作成するなど、別の方法を検討する必要があります。例えば :

+1

こんにちは、応答ありがとうございます。しかし、この「設定」クラスには「保存」機能があります。新しい設定を有効にするには、本当にアプリを再起動する必要がありますか? – jerbersoft

+4

web.configを自動的に変更すると、アプリケーションが再起動されます。 –

+1

web.configを動的に変更することは推奨できません。私は(XML)ファイルに値を格納することをお勧めします。 –

16

これは(Visual Studio 2008でテスト)このシナリオのためのよりよい解決策である:2018 =>
は2015対でテスト

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

アップデート - 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(); 
+0

なぜそれが良いのか少し詳しく説明できますか?私はconfigSectionのものは時々少しトリッキーです知っている。 – julealgon

+0

このコードは小さく、理解しやすいです! 少なくとも私にとって。 –

+3

ああ、それは個人的な味のために、私は実際にそれがどういうわけか論理的に異なっていると思った。実際に必要とされているものと意味的に異なるため、同じキーを2回指定する必要があるため、この場合は非常に反対です(「更新」vs「削除」 - コードを実際にはもっと長くしています(ここではなぜあなたのものなのかわからないので)、誤って開きます。また、何らかの理由でコード間でコードが失敗する場合はどうなりますか?あなたのアプリケーションはそこから壊れていると思います。 – julealgon

21

をそして、あなたはアプリケーションの再起動を避けたい場合は、appSettingsセクション外に移動することができます:Oチェック要素は、このコードを使用して存在する別のファイルに

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

を。そしてConfigurationSaveMode.Minimal

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

と組み合わせて使用​​するには、アプリケーションの再起動を引き起こすことなく、通常のappSettingsセクションとは異なる形式のファイルを使用することなく、様々な設定を保存するためのappSettingsセクションを使用し続けることができます。

11

私はこの質問が古くなっていることを知っていますが、現実世界の経験と合わせたASP.NET \ IIS世界の現在の状況に基づいた回答を投稿したいと思いました。

私は最近私の会社でプロジェクトの先頭に立ち、私たちのweb.configファイルのすべてのappSettings & connectionStrings設定を1か所の中央に統合して管理したいと思っていました。プロジェクトの成熟度が&で安定しているため、私たちの設定がZooKeeperに保存されている方法を追求したいと思っていました。もちろん、ZooKeeperはコンフィグレーションでは&のクラスタ管理アプリケーションです。

プロジェクトの目標は非常に単純でした。

  1. はGlobal.asaxの、のApplication_StartでのZooKeeper
  2. と通信するために、ASP.NETを得る - の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 

このプロセスは、アプリケーションプールのリサイクルが発生した場合には、イベントログエントリはそれがありませんでした、記録されている必要があります。

これは、集中管理された記憶媒体からアプリケーションの設定をロードすることが可能であり、実際には安全であると結論づけています。

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

<appSettings> 

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

    </appSettings> 

ポイントに直接好き
+0

これはたぶん私を数時間節約しました。本当にありがとう! –

+0

ようこそ。 – Sage

2

(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(); 
     } 
    } 
} 
関連する問題