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


82

두 개의 응용 프로그램이 하나는 콘솔 응용 프로그램이고 다른 하나는 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를 계속 사용하고 외부 위치에서 값을 가져올 수 있습니까?
이를 수행하기 위해 코드를 추가해야하는 것에 만족하지만 전체 구성 관리자 시스템을 교체 할 필요는 없습니다.

답변:


103

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

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


좋은 - 사람들이 내 방식보다 이해하기 훨씬 쉽게
로버트 맥클레인

10
안녕하세요, 저는이 답변을 좋아하고 내 프로젝트에 적용하려고 시도했습니다. 내 앱을 "게시"하면 모든 것이 잘 작동하는 것 같습니다 (db.config는 말한대로 webroot에 복사 됨).하지만 VS를 통해 디버깅 할 때는 그렇지 않습니다. & 카시니. 대신 "Unable to open configSource file 'db.config'"예외가 발생합니다. 이 작업을 수행하기 위해 내가 놓친 것이 있습니까? 감사!
Funka 2010-06-16

16
물론 내가 해체하고 도움을 요청하는 댓글을 게시하기로 결정한 직후에야 바로 나중에 알아낼 수 있습니다. 내 db.config / bin / 폴더에 복사되는 것을 알았 으므로 web.config를 업데이트하여이 경로를 앞에 추가했습니다 configSource. 다시 한 번 감사드립니다!
Funka

1
@Funka-db.config의 "Build Action"속성이 기본 web.config와 같이 "Content"대신 "None"으로 설정되어 있기 때문에 문제가 있는지 확인하십시오. 설정이 "Build Action"= "Content"및 "Copy to Output Directory"= "Do not copy"이어야한다고 생각합니다.
bopapa_1979 2013

1
이것은 VS 2013에서 디버깅 할 때 작동하지 않는 것 같습니다. Erics 솔루션을 시도했지만 이것도 작동하지 않았습니다.
Chris Nevill 2014


16

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

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


10

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 폴더에 있지 않기 전에이 작업을 수행하지 않았다면 바로 클릭하지 않을 수 있습니다.


8

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

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

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

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


전체 구성 파일을로드해야합니다. appSettings 및 connectionStrings 만 동일하면 나머지 파일은 각 앱마다 다르므로 문제가 해결되지 않습니다.
Robert MacLean

어쨌든 전체 구성은 일반 (정적) 속성에 의해로드되므로 실제 차이는 없습니다.
리처드

또한 고유 한 XML 형식을 사용하고 이름을 응용 프로그램의 구성 파일에 추가하고 직접 읽을 수 있습니다.
Richard

5

연결 문자열의 경우 실제로 공유 파일을 가리킬 수 있습니다. 공유 파일이 네트워크 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의 경우 웹 사이트 또는 앱 풀을 수동으로 다시 시작해야합니다.

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


3

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


옵션이지만 컴퓨터의 다른 응용 프로그램에서 사용할 수있는 설정을 원하지 않습니다 (필요하지 않음). 걱정은 연결 문자열입니다. 그들은 다른 응용 프로그램과 충돌 할 수있는 꽤 일반적인 이름을 가지고 있습니다.
Robert MacLean

2

가장 잘 작동하는 솔루션은 "공유"구성 파일을 중앙 파일에 넣은 다음 Visual Studio의 사전 빌드 이벤트를 사용하여 필요한 각 프로젝트의 상대 폴더에 복사하는 것이 었습니다.


2

이 문제에 대해 상당히 고생했지만 여기서 좋은 해결책을 찾았습니다. 외부 구성으로 테스트 실행

(.testrunconfig 파일을 편집하여 파일 및 디렉토리를 테스트 실행 디렉토리로 복사하도록 테스트 실행을 지시 할 수 있습니다.)

단위 테스트 유형 프로젝트가 자체 app.config에서 구성 설정을 가져올 수 있지만 일반 app.config와 같이 참조 된 구성 파일을로드 할 수없는 이유는 나에게 다소 당혹 스럽습니다. 테스트 프로젝트 app.config가 애플리케이션의 app.config와 동일한 방식으로 작동 할 것으로 예상하기 때문에이를 버그라고 부르지 만 그렇지 않습니다.


1

file대신 속성을 사용할 수 있습니다.configSource

여기 에 좋은 기사가 있습니다 .

이렇게하면 상대 경로를 지정할 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

경로는 출력 디렉토리에 상대적입니다.

그런 다음 ExternalFile.config에서 appSettings섹션을 추가하기 만하면됩니다.

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.