2013-07-02 3 views
3

저는 비즈니스 파트너와 협력하기 위해 파트너 중 한 사람과 협력하고 있습니다. WCF (.Net 3.5)를 사용하여 파트너 웹 서비스와 통신합니다. 나는 파트너 웹 서비스가 자바로 작성되었다고 생각한다.접두사 SOAP XML 대신 직접 네임 스페이스

SVC util을 사용하여 프록시 클래스를 생성했습니다. DataContract serializer 대신 svcutil이 xmlserializer를 사용했습니다. 그러나 파트너가 제공 한 WSDL과 웹 서비스 응답 SOAP xml은 일치하지 않습니다. 파트너가 wsdl 변경에 관심이 없으므로 다운로드 한 WSDL을 수동으로 변경하여 응답과 일치시킵니다. 그 문제는 수정되었습니다.

이제 다른 문제가 있습니다. 웹 서비스에 요청을 보내면 항상 실패합니다. 그런 다음 피들러를 사용하여 SOAP 요청을 파트너에게 전달했습니다. 파트너는 요청으로 보낸 XML 네임 스페이스가 시스템에 대해 유효성을 검사하지 않는다고 말했습니다. 그들은 또한 샘플 SOAP 요청으로 응답했다.

두 요청을 모두 비교하면 네임 스페이스가 올바르게 보입니다. 그러나 xml 파트너는 접두사를 사용하여 네임 스페이스를 정의하고 요소 앞에 접두어가 붙습니다. 우리쪽에있는 xml에는 접두사가 없지만 대신 부모 요소에서 직접 네임 스페이스를 사용했습니다.

여기, 우리가 여기

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <iL21stCentRq xmlns="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing"> 
     <ACORD xmlns="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing"> 
      <SignonRq xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/"> 
       <SignonPswd> 
        <CustId> 
         <SPName>111</SPName> 
        </CustId> 
       </SignonPswd> 
      </SignonRq> 
     </ACORD> 
    </iL21stCentRq> 
</s:Body> 

를 전송 파트너가 우리

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stc="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing" xmlns:stc1="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing" xmlns:acd="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/"> 
<soapenv:Header/> 
<soapenv:Body> 
    <stc:iL21stCentRq> 
     <stc:input> 
      <stc1:ACORD> 
       <acd:SignonRq> 
        <acd:SignonPswd> 
         <acd:CustId> 
          <acd:SPName>yourcompany.com</acd:SPName> 
         </acd:CustId> 
        </acd:SignonPswd> 
       </acd:SignonRq> 
      </stc1:ACORD> 
     </stc:input> 
    </stc:iL21stCentRq> 
</soapenv:Body> 

당신이 XML 둘을 비교하면

에서 예상되는 샘플 XML 인 XML이다 네임 스페이스 http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/은 partner xml에 "acd"가 접두사로 붙습니다. 파트너는 우리가 그 형식으로 보내길 원했습니다.

파트너 XML이 표준을 따르지 않는다고 생각합니다. 이것은 정말로 파트너 문제입니다. 그러나 나는 왼쪽 편에있는 옵션이 없었고, 내 편에서 XML을 변경해야했다.

우리는 WCF 서비스에서 serialization을 사용자 지정할 수 있지만이 수준에서 접두사를 변경할 수 있는지 확신하지 못합니다. 게다가 파트너 Xml이 XSD 표준을 따르고 있는지 확신 할 수 없습니다.

위의 변경 사항을 수용하기 위해 WCF 직렬화를 수정할 수 있다면 감사하게 생각합니다.

+0

XML을 이해하는 파트너를 찾아야합니다. 접두사는 XML에서 중요하지 않으며 네임 스페이스 만 중요합니다. 파트너가 다르게 생각하면 유능하지 않습니다. –

+0

표준의 모든 목적은 귀하와 같은 사람들이 귀하가 다루는 파트너마다 소프트웨어를 사용자 정의 할 필요가 없도록하기 위해서입니다. 그들은 모두 표준을 따라야하며 이것은 새로운 표준이 아닙니다. 그것을지지하지 않을 이유가 없습니다. –

+0

@JohnSaunders 전 완전히 동의합니다. – Amzath

답변

3

SVC Util에서 생성 한 고정 프록시 클래스입니다. 나는 접두어를 방출하는 새로운 속성을 추가했습니다. 예를 들어 SignonRq 클래스에서 다음 속성을 추가했습니다. 그것은 접두어 acd로 XML을 직렬화했습니다.

 [XmlNamespaceDeclarations()] 
    public XmlSerializerNamespaces xmlsn 
    { 
     get 
     { 
      XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); 
      xsn.Add("acd", "http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/"); 
      return xsn; 
     } 
     set 
     { 
      //Just provide an empty setter. 
     } 
    } 

예를 들어 ACORD 클래스의 경우 다음 속성을 추가했습니다. 그것은 접두어 stc1로 XML을 직렬화했다.

 [XmlNamespaceDeclarations()] 
    public XmlSerializerNamespaces xmlsn 
    { 
     get 
     { 
      XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); 
      xsn.Add("stc1", "http://schemas.WebServiceProvider.com/us/ileads/types/Servicing"); 
      return xsn; 
     } 
     set 
     { 
      //Just provide an empty setter. 
     } 
    } 
+0

접두어에'acd'를 쓰려고하지 않았습니까? –

+0

@JohnSaunders 네임 스페이스 http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/의 경우 접두어 acd를 원했습니다. 그들은 네임 스페이스 http://schemas.WebServiceProvider.com/us/ileads/types/Servicing에 접두사 stc1을 원했습니다. – Amzath

+0

클래스에이 속성을 추가 했으므로 속성을 포함한 전체 클래스를 게시 할 수 있습니까? 변경된 사항은 없습니다. 감사. –

관련 문제