2009-11-16 4 views
10

저는 재미 있고 유능한 'saw'를 위해 기본적인 작은 웹 응용 프로그램을 작성하고 있는데 AppSettings에 약간의 문제가 있습니다.ASP.NET MVC 컨트롤러를 통해 AppSettings 업데이트

웹 프로젝트 사용자 계정에 수정 권한을 부여하고이 파일에 모든 편집 가능한 설정을 저장하는 자신의 파일 (Settings.config)에 이러한 설정을 적용 할 계획입니다 (예 : 포럼 제목, 설명, 기타).

내 코드입니다 :

 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(FormCollection collection) 
{ 
    try 
    { 
     var config = WebConfigurationManager.OpenWebConfiguration("~/Web.config"); 

     config.AppSettings.Settings["SiteTitle"].Value = collection["SiteTitle"]; 
     config.AppSettings.Settings["SiteDescription"].Value = collection["SiteDescription"]; 

     config.Save(ConfigurationSaveMode.Minimal, false); 
     ConfigurationManager.RefreshSection("appSettings"); 

     return RedirectToAction("Index"); 
    } 
    catch (Exception ex) 
    { 
     ModelState.AddModelError("_FORM", ex.Message); 
     return View("Index"); 
    } 
} 

...하지만 다음과 같은 오류를 반환 실행 : 내가 설정 파일을 모든 사용자에게 전체 권한을 부여하려고했습니다

A configuration file cannot be created for the requested Configuration object.

을 , 아무런 영향을 미치지 않습니다. (저는 현재 카시니 (Cassini)에서 운영되고 있습니다. 그래서 프로세스 사용자는 저에게 어떤 경우에도 파일 소유권을 가지고 있습니다.)

아이디어가 있으십니까?

답변

18
이 귀하의 첫 번째 라인을 변경

: 그것은있을 수 있습니다

var config = WebConfigurationManager.OpenWebConfiguration("~"); 

혼란으로, OpenWebConfiguration은의 Web.config가있는 가상 경로, 파일 이름을 제외한 것으로 기대하고있다. 논리는 이름이 불필요한 경우를 포함하여 특정 디렉토리에 하나의 Web.config 만 있다는 것입니다.궁극적으로

MSDN documentation 여기에 단서 우리를 - 당신이 예를 보면 그들은 모두 명시 적으로 상대 경로를 사용하고 IIS에서 호스팅 할 때 예를 들어, 당신은 다른 위치에서 설정 파일을 지정할 수 있습니다 :

OpenWebConfiguration("/siteName", "Default Web Site", null, "myServer"); 

부록 :

그렇다면 OpenWebConfiguration("~/Web.config")은 왜 작동합니까? 확실하게 설명 할 수 있을지 모르겠지만 킥을 시도해보십시오. ("~/Foo.bar")으로 변경하십시오. 같은 결과! 같은 Web.config 파일을 읽을 수는 있지만 쓸 수는 없습니다! (이제 foo.bar 디렉토리를 사이트에 추가 한 다음 Web.config를 그 안에 넣으십시오 ...)

OpenWebConfiguration은 디렉토리를 필요로하기 때문에 웹을 찾으면 존재하지 않는 것으로 간주되므로 .config 부모), 내 생각에 이것은 ~/Web.config를 "경로"로 잘못 지정하면 루트 구성을로드 할 수 있지만 저장하지는 않습니다.

+0

사실 그것은 내가 들어 본 적이없는 매우 흥미로운 행동입니다. 내가 이것을 조금 설명해 주셔서 대단히 감사합니다. – Venemo

+0

감사합니다. 매우 흥미 롭습니다. 오늘 밤에 이걸 드리겠습니다. –

+1

매력처럼 작동했습니다 - 감사합니다! –

0

다른 프로젝트에서이 파일을 실행하는 경우 해당 폴더에서 config 파일을 사용하지 않으므로 구성 파일이 없으므로 만들 수없는 오류가 발생합니다.

웹 폴더 구성 파일을 가져 오기 위해 server.mappath 또는 이와 비슷한 것을 사용할 수 있습니다.

+0

"다른 프로젝트에서 실행"이란 무엇을 의미합니까? –

+0

웹 사이트가 있고 비즈니스 계층을 말하고 코드가 비즈니스 계층 프로젝트에서 실행중인 경우 찾고있는 구성 파일이 비즈니스 계층 프로젝트에 있다고 의심됩니다. 당신은 웹 설정 파일에 대한 경로를 알아야합니다. – griegs

+0

아, 제 생각에는 ... 실제로는 아니오, 저는 보통 이런 식으로 설정합니다.이 경우 저는 게으르며 "모델"폴더에 비즈니스 계층이 있습니다. 내 MVC 애플 리케이션의. –

1

이 시도 :

var configFile = HttpContext.Current.Server.MapPath("~/Web.config"); 
var config = WebConfigurationManager.OpenWebConfiguration(configFile); 

는 그러나, 나는 그것이 동적으로 변경하기위한 것입니다 특히,의 Web.config에서 이러한 종류의 정보를 저장하는 나쁜 아이디어라고 생각합니다.

별도의 구성 파일을 사용하려는 경우에도이 방법을 다른 방법으로 저장하고 System.Configuration의 클래스를 통해 자체 구성을 얻지 않아도됩니다. 이들은 주로 ASP.NET 애플 리케이션의 Web.Config 및 Windows 응용 프로그램 인 App.Config를 읽고 다른 것들과 함께 작업하게하는 것은 의미가 없습니다.

다음을 권장합니다.

프로젝트에 별도의 XML 파일을 추가하십시오. (웹에서 액세스 할 수없는 App_Data 폴더, 응용 프로그램에서 이미 읽고 쓸 수있는 권한이있는 위치).

그러면 XML에 이러한 종류의 설정을 저장할 수 있습니다. System.Xml 또는 LINQ to XML을 사용하여 작성하십시오.

+0

그래, 이걸 하는게 최선의 방법이 아닐지도 몰라 - 그게 효과가 있는지보고 싶었어. 뭔가 다른 것을 시험해보고 싶었어. (내 데이터베이스에서 설정 테이블을 설정하기에는 너무 게으른거야. 정직;)) –

+1

@ 베네모 - 제안은 많은 의미가 있습니다. web.config의 제한없이 자유롭게 읽고 쓸 수있는 XML 파일을 사용하는 것이 훨씬 더 실용적입니다. 또한 AppData에 배치하고 읽기 및 쓰기 권한이 부여 된 제안을 좋아했습니다. 수많은 앱에서 공유 할 수 있다는 것은 말할 것도 없습니다. 내가 그걸 멀리 갈 것입니다 :) –

+0

@ BenJunior - thanks :) 내가 도울 수있어서 기쁩니다! – Venemo