2009-04-06 5 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

가있다 web.config의 수정에 대해 잘 설명하는 좋은 링크 t 런타임 및 응용 프로그램에 미치는 영향. [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

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

조금 더 자세히 설명해 주시겠습니까? 내가 configSection 물건을 때로는 조금 까다 롭습니다 알아요. – julealgon

+0

이 코드는 작고 이해하기 쉽습니다. 적어도 나를 위해서. –

+3

아, 그건 개인적인 취향 때문이죠. 사실 논리적으로 어떻게 든 달라진 것 같습니다. 나는이 경우 많은 경우에 실제로 동의하지 않는다 : 실제로 당신이하고있는 일은 실제로 필요한 것 ('update'vs 'remove->')과 다른 의미를 지니고 있기 때문에 두 번째로 같은 키를 지정해야하기 때문에 두 번째 이유가있다. 추가 '), 세 번째 코드가 실제로 더 길기 때문에 (세 번째 이유는 확실하지 않은 이유) 실수로 열릴 수 있기 때문입니다. 또한 어떤 이유로 호출간에 코드가 실패하면 어떻게됩니까? 내 생각 엔 거기에서 응용 프로그램이 고장났습니다. – 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 설정을 통합하고 관리하고자하는 회사에서 프로젝트를 주도했습니다. 프로젝트 성숙도가 & 인 안정성으로 인해 ZooKeeper에 설정이 저장되는 방식을 추구하고 싶었습니다. ZooKeeper가 설계 상으로는 구성 관리 응용 프로그램 인 & 구성이라는 사실은 말할 것도 없습니다.

프로젝트 목표는 매우 간단했습니다.

  1. 가져 오기 ASP.NET은 Global.asax에, 위해 Application_Start에서 사육사
  2. 와 통신 - 사육사로부터의 web.config 설정을 당깁니다.

ASP.NET을 ZooKeeper와 대화하기위한 기술적 인 부분을 통과하자마자 다음 코드를 사용하여 벽을 찾아 냈습니다. 내가 appSettings는 컬렉션에 새로운 설정을 추가하고 싶어하기 때문에

ConfigurationManager.AppSettings.Add(key_name, data_value) 

그 문

는 가장 논리적 인 감각을했다. 그러나 원래 포스터 (및 기타 많은) 언급 한 바와 같이이 코드 호출은 컬렉션이 읽기 전용임을 나타내는 Error를 반환합니다.

사람들이이 문제를 해결하기 위해 조사한 결과와 다른 여러 가지 미친 방법을 본 후에 나는 매우 낙담했습니다. 포기하거나 이상적인 시나리오가 아닌 것으로 보이는 것을 정착시키는 대신에, 나는 파고 들어 뭔가를 놓치고 있는지를 결정했습니다.

약간의 시행 착오를 통해 다음 코드가 내가 원하는 것을 정확하게 수행 할 수 있다는 것을 알았습니다.

ConfigurationManager.AppSettings.Set(key_name, data_value) 

이 코드 줄을 사용하여 이제 Application_Start의 ZooKeeper에서 85 개의 appSettings 키를 모두로드 할 수 있습니다.

IIS 재사용을 트리거하는 web.config의 변경 사항에 대한 일반적인 내용과 관련하여 다음과 같은 appPool 설정을 편집하여 백그라운드에서 상황을 모니터링합니다. 이 과정은 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에 배포 할 예정입니다. 이 답변과 관련된 사항이 변경되면 그에 따라이 답변을 업데이트하겠습니다.귀하의 구성에 지점에 직접 좋아하는

+0

이것은 아마도 몇 시간 만 구해줬을 것입니다. 정말 고마워! –

+0

반갑습니다. – Sage

2

,

코드에서
<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(); 
     } 
    } 
} 
관련 문제