2014-03-04 5 views
3

Visual Studio 2013 Premium 사용.Web.Config transforms : Insert()를 사용하여 여러 요소 변환

목표 : web.config에 여러 개의 WCF 서비스가 정의되어 있습니다. web.config 파일을 읽기 쉽게 유지하고 서비스를 더 간단하게 만들기 위해 VS2013의 XML 변환을 사용하여 내 dev/production 환경의 각 서비스 정의에 상용구 요소를 추가하고 싶습니다.

문제점 : 여러 개의 <service> 태그가 있지만 첫 번째 태그 만 제대로 변환됩니다.

내가 다른 일을 메타 데이터 교환 끝점을 만들고 싶지
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="AppName.AccountManagerService"> 
     <endpoint address="AccountManagerService" binding="netTcpBinding" 
      bindingConfiguration="" contract="Shared.Contracts.IAccountManagerService" /> 
     </service> 
     <service name="AppName.TicketManagerService"> 
     <endpoint address="TicketManagerService" binding="netTcpBinding" 
      bindingConfiguration="" contract="Shared.Contracts.ITicketManagerService" /> 
     </service> 
    </services> 
</configuration> 

(도시하지 않음) 각 <service> 태그 :

여기에 정의 된 두 가지 서비스 내의 Web.config의 단순화 된 버전입니다. 나는이 얻을

<?xml version="1.0" encoding="utf-8"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <system.serviceModel> 
    <services> 
     <service xdt:Locator="XPath(/configuration/system.serviceModel/services/service)"> 
     <endpoint kind="mexEndpoint" 
        address="mex" 
        xdt:Transform="Insert()" 
       /> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="AppName.AccountManagerService"> 
     <endpoint address="AccountManagerService" binding="netTcpBinding" 
      bindingConfiguration="" contract="Shared.Contracts.IAccountManagerService" /> 

     <!-- Yay! --> 
     <endpoint kind="mexEndpoint" 
        address="mex" 
       /> 

     </service> 
     <service name="AppName.TicketManagerService"> 
     <endpoint address="TicketManagerService" binding="netTcpBinding" 
      bindingConfiguration="" contract="Shared.Contracts.ITicketManagerService" /> 

     <!-- Hey, where's the endpoint tag for this one? --> 

     </service> 
    </services> 
</configuration> 

내가 xdt:Locator 속성에 XPath 인수에 이러한 변화를 시도했습니다 여기

만 MetadataExchange를 끝점을 보여주는 단순화 Web.Debug.Config입니다 of :

1. /configuration/system.serviceModel/services/service 
2. /configuration/system.serviceModel/services//service 
3. //service 

hich 변환 첫 번째 <service> 섹션.

나는 <endpoint> 태그 등에 속성을 넣어 봤지만 아무 소용이 없습니다.

XPath 비주얼 라이저 및 도구가 여러 개 있습니다. 위의 XPath # 1과 함께 사용할 경우 모두<service> 태그와 일치합니다. 또한이 오류는 "미리보기 변형"및 웹 배포 도구 미리보기에서 발생합니다.

내가 뭘 잘못하고 있니?

(내 해결 방법은이 시점에서 원래의 Web.Config에 Mex 엔드 포인트와 나머지 디버깅 크루프를 포함시킨 다음 "RemoveAll()"로 제거하는 것이지만 Web.Config를 만듭니다. 정말 어수선하고 읽기가 어렵습니다.)

답변

1

최근에이 문제가 발생하여 지원되지 않습니다.

제 작품에서 사용자 정의 변환을 추가하고이를 삽입 대신 사용했습니다. 이 구현의 문제는 기본 삽입이 첫 번째 값만 수정한다는 것입니다 (XPath 표현식이 목록을 검색하더라도). http://xdt.codeplex.com/

내가 올바른 방향으로 나있어 그 가로 질러 기사 :

XDT 소스는 여기에서 찾을 수 있습니다 내가 무슨 짓을 http://blog.appharbor.com/2012/07/27/custom-web-config-transforms-and-merges

자신의 소스에 새 클래스를 추가하고, 할 수 있었다 당신이 찾고있는 것을 정확하게 얻기 위해서.

internal class InsertMultiple : Transform 
{ 
    public InsertMultiple() 
    { 
     //this is the line that allows it to apply the transform for all nodes 
     //that were located with your XPath expression. 
     ApplyTransformToAllTargetNodes = true; 
    } 

    protected override void Apply() 
    { 
     CommonErrors.ExpectNoArguments(Log, TransformNameShort, ArgumentString); 

     TargetNode.AppendChild(TransformNode); 

     Log.LogMessage(MessageType.Verbose, SR.XMLTRANSFORMATION_TransformMessageInsert, TransformNode.Name); 
    } 
}