[.net] .NET 구성 파일 configSource는 응용 프로그램 디렉터리 폴더 외부에 있습니다.

두 개의 응용 프로그램이 하나는 콘솔 응용 프로그램이고 다른 하나는 ASP.NET 응용 프로그램입니다. 둘 다 동일한 appSettings 및 connectionStrings를 알아야합니다. 그래서 이상적으로는 app.config / web.config 파일의 configSource 속성을 사용하여 중앙 위치를 가리키고 싶습니다. 예를 들면

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

그러나 오류와 함께 실패합니다.

configSource 속성이 잘못되었습니다. : configSource ‘D : \ appSettings.config’가 잘못되었습니다. 구성 파일과 동일한 디렉토리 또는 하위 디렉토리에있는 파일을 참조해야합니다.

어쨌든 구성 관리자 appSettings / connectionStrings를 계속 사용하고 외부 위치에서 값을 가져올 수 있습니까?
이를 수행하기 위해 코드를 추가해야하는 것에 만족하지만 전체 구성 관리자 시스템을 교체 할 필요는 없습니다.



답변

또 다른 해결책은 실제로 파일을 프로젝트에 복사하는 대신 모든 프로젝트의 구성 파일을 링크로 추가하는 것입니다. 그런 다음 파일의 “Build Action”을 “Content”로, “Copy to Output Directory”를 “Copy if newer”로 설정하고 프로젝트를 컴파일 할 때 출력 디렉토리에 파일을 갖게됩니다.

“기존 항목 추가”대화 상자에서 파일을 링크로 추가하려면 드롭 다운이있는 추가 버튼이 있습니다. 추가 버튼의 드롭 다운에서 “링크로 추가”를 선택하여 프로세스를 완료합니다.


답변

appSettings에서 configSource = 대신 file =을 사용할 수 있습니다.


답변

그게 그런 것 같습니다. configSource는 동일한 폴더 이상이어야합니다.

당신은 잘 모르겠어요하지만, 당신은 해야한다 ,는 NTFS 하드 링크를 사용합니다. [미친 웃음]


답변

Visual Studio 2015

Web.Config 에서이 문제가 발생하는 경우 수락 된 대답은 정확하지만 이것이 나에게 얼굴 손바닥을 제공했기 때문에 확장하기 위해서입니다.

‘링크로 추가’를 사용하여 프로젝트에 .config 파일을 추가 한 다음 링크의 복사 속성을 ‘최신 인 경우 복사’또는 ‘항상 복사’로 설정하면 실제 파일이 / bin 폴더에 복사됩니다.

따라서 Web.Config에 다음과 같이 정의 된 구성 섹션이있는 경우 :

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

그런 다음 다음과 같이 관련 구성 요소를 정의해야합니다.

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

configSource 가 링크가 아닌 실제 bin \ MySpecialConfig.config 파일을 가리 키도록합니다. 또한 경로가 상대 실제 경로 라는 점에 유의하십시오 .

엄청나게 분명해 보일 수 있지만 실제 파일이 아직 \ bin 폴더에 있지 않기 전에이 작업을 수행하지 않았다면 바로 클릭하지 않을 수 있습니다.


답변

임의의 위치에서 구성을로드 할 수 있지만 ConfigurationManager의 정적 속성을 통해 사용할 수 없습니다.

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(기본 / 사용자 로밍 / 사용자 로컬 계층 구조를 지원하기 위해 여러 파일을 지정할 수있는 오버로드가 있습니다.)

정적 속성이 손실되면 모든 코드가 다른 구성을 인식해야합니다.


답변

연결 문자열의 경우 실제로 공유 파일을 가리킬 수 있습니다. 공유 파일이 네트워크 UNC에있는 경우 앱을 호스팅 할 컴퓨터에 대한 관리자 권한이 필요합니다.

해결 방법 : web.config에서 configSource를 사용하여 로컬 구성 파일을 가리 킵니다. .Net 제한으로 인해 이는 루트 구성 파일 수준 이하 여야합니다. 앱 폴더 자체의 파일을 가리 킵니다.

<connectionStrings configSource="ConnectionStrings.config" />

응용 프로그램 풀 사용자가 액세스 할 수있는 공유 위치에서 공유 연결 문자열이 포함 된 구성 파일을 추가합니다. 이 파일에는 connectionStrings 섹션 자체가 아닌 xml이 포함되어서는 안됩니다. 공유 파일 ConnectionStrings.config는 다음과 같습니다.

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>

이제 트릭입니다. 앱 폴더에 외부 공유 구성 파일을 가리키는 Windows 심볼릭 링크를 만듭니다. 이 작업을 수행하려면 관리자 권한이 필요합니다.

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

우리는 방금 .Net을 능가했습니다. 구성 시스템은 configSource 설정을 사용하여 ConnectionStrings.config라는 로컬 파일에서 연결 문자열을 찾습니다. 심볼릭 링크는 .Net에 대한 파일처럼 보이고 심볼릭 링크는 공유 구성 파일로 해석됩니다.

주의 사항 : 공유 파일을 변경해도 .Net에서 앱 다시 시작이 자동으로 트리거되지 않습니다. IIS의 경우 웹 사이트 또는 앱 풀을 수동으로 다시 시작해야합니다.

심볼릭 링크를 생성하려면 관리자 권한이 필요하기 때문에이 접근 방식은 모든 사람에게 적용되지 않을 수 있습니다. 공유 파일이 동일한 논리 드라이브에있는 경우 작동 할 수있는 두 가지 관련 대안 (하드 링크 및 접합)이 있습니다. 참조 이러한 논의 하고 이 논의 자세한 내용입니다.


답변

machine.config에 두 설정을 모두 배치 하면 서버의 모든 응용 프로그램에서 사용할 수 있습니다.