[asp.net] web.config 변환을 사용하여“바꾸기 또는 삽입”을 수행하는 방법이 있습니까?

다른 환경에 대한 구성을 생성하기 위해 아래 게시물에 설명 된대로 web.config 변환을 사용하고 있습니다.

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

키를 일치시켜 “바꾸기”변환을 수행 할 수 있습니다. 예 :

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />

“삽입”을 할 수 있습니다. 예 :

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />

그러나 실제로 유용한 것은 ReplaceOrInsert 변환입니다. 왜냐하면 항상 특정 키가 있거나없는 원래 구성 파일에 의존 할 수는 없기 때문입니다.

이것을 할 수있는 방법이 있습니까?



답변

저렴한 해결 방법을 찾았습니다. “바꾸거나 삽입”해야하는 요소가 많으면 예쁘지 않고 잘 작동하지 않습니다.

“제거”와 “삽입 후 | 삽입 전”을 수행하십시오.

예를 들어

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>


답변

VS2012에서의 xdt:Transform="Remove"사용 과 함께 xdt:Transform="InsertIfMissing".

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>


답변

InsertIfMissingappSetting이 존재하는지 확인 하려면 변환을 사용하십시오 .
그런 다음 Replace변환을 사용하여 값을 설정하십시오.

<appSettings>
  <add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

SetAttributes대신 변환을 사용할 수도 있습니다 Replace. 차이점은 SetAttributes자식 노드를 건드리지 않는다는 것입니다.

<appSettings>
  <add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>

기존 노드가 상위 노드의 맨 아래로 이동하지 않기 때문에 이러한 기술은 remove + insert보다 훨씬 낫습니다. 새로운 노드가 끝에 추가됩니다. 기존 노드는 소스 파일에있는 그대로 유지됩니다.

이 답변은 최신 버전의 Visual Studio (2012 이상)에만 적용됩니다.


답변

더 좋은 방법은 특정 속성 만 설정하기 때문에 요소가 존재하지 않는 경우에만 요소를 삽입하는 것입니다. 요소를 제거하면 기본 요소의 다른 속성이 있으면 버립니다.

예 : web.config (요소 없음)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

web.config (요소 포함)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceDebug httpsHelpPageEnabled="true" />
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

XPath 표현식과 함께 로케이터를 사용하여 노드가 존재하지 않으면 노드를 추가 한 다음 속성을 설정하십시오.

<serviceDebug xdt:Transform="Insert"
  xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />

결과 web.config 파일에는 모두 includeExceptionDetailInFaults = “true”가 있고 두 번째 파일에는 remove / insert 메소드가없는 httpsHelpPageEnabled 속성이 유지됩니다.


답변