2011-08-19 4 views
5

외부 (java) 응용 프로그램이 웹 서비스에 메시지를 보냅니다. 이 메시지는 여러 네임 스페이스를 포함WCF - 비 직렬화 할 때 네임 스페이스 제어

<StUF:Fo01Bericht xmlns:StUF="http://www.egem.nl/StUF/StUF0300"> 
    <LVO:stuurgegevens xmlns:LVO="http://www.vrom.nl/StUF/sector/lvo/0305"> 
     <StUF:versieStUF>0300</StUF:versieStUF> 
     <StUF:berichtcode>Fo01</StUF:berichtcode> 
    </LVO:stuurgegevens> 
    <StUF:body> 
     <StUF:code>200</StUF:code> 
     <StUF:plek>LVO</StUF:plek> 
     <StUF:omschrijving>test</StUF:omschrijving> 
    </StUF:body> 
</StUF:Fo01Bericht> 

WCF 서비스 때문에 둘째 줄에 LVO 프리픽스의 메시지를 직렬화 수 없다 (이는 WSDL에 따른 STUF 했어야).

나는이 메시지를 받아들이도록 우리의 웹 서비스를 원한다. 선호하는 속성을 사용하여이를 수행 할 수있는 방법이 있습니까?

답변

1

DataContract 네임 스페이스를 수정하여이를 수행 할 수 있다고 생각하지 않습니다. 그 이유는 DataMember 특성이 클래스 속성이 클래스 자체와 동일한 XML 네임 스페이스에 있다고 가정하기 때문입니다. 그러나 MessageContractMessageBodyMember 속성을 조합하여이 작업을 수행 할 수 있습니다. 또 다른 간단한 방법은 implement a message inspector에 비누 메시지를 재 형식화하여 예상 XML 스키마를 준수하는 것입니다.

+0

WFF 직렬화를 향상시킵니다. 이 서비스는 XML Serialization에 의존합니다. 이미 XmlNamespaceDeclarations 특성을 사용하려고했습니다. 하지만 그건 효과가없는 것 같습니다. –

+1

IXmlSerializable 인터페이스를 구현하여 문제가 해결되었습니다. –

+0

@WvanNoort 당신이 한 일을 확장 할 수 있습니까? 나는 지금도 같은 문제를 겪고있다. – Declan

1

제 3 자로부터 비누 메시지를받을 때이 문제가있었습니다.

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wssu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:UsernameToken> 
      <wsse:Username>userName</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">password</wsse:Password> 
      <wsse:Nonce>nonce</wsse:Nonce> 
      <wssu:Created>2015-02-19T16:24:32Z</wssu:Created> 
     </wsse:UsernameToken> 
    </wsse:Security> 

제대로 역 직렬화 나는 아래, 내 DataContract에 IxmlSerializable을 구현하는 데 필요한하려면 : 여기

내가 전송되고 있던 SOAPHeader에 (UsernameToken이 내 다른 네임 스페이스를 참고)입니다

[DataContract(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", Name = "Security")] 
public partial class SecurityHeaderType 
{ 
    [XmlElementAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")] 
    [DataMember] 
    public UsernameToken UsernameToken { get; set; } 
} 

public class UsernameToken : IXmlSerializable 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Nonce { get; set; } 
    public string Created { get; set; } 

    public XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     Dictionary<string, string> secDictionary; 
     string xml = reader.ReadOuterXml(); 

     using (var s = GenerateStreamFromString(xml)) 
     { 
      secDictionary = 
         XElement.Load(s).Elements() 
         .ToDictionary(e => e.Name.LocalName, e => e.Value); 
     } 

     Username = secDictionary["Username"]; 
     Password = secDictionary["Password"]; 
     Nonce = secDictionary["Nonce"]; 
     Created = secDictionary["Created"];   

    } 

다음과 같이 내 머리글을 deserialize 할 수있었습니다.

if (OperationContext.Current.IncomingMessageHeaders.FindHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd") != -1) 
{ 
    var securityHeader = OperationContext.Current.IncomingMessageHeaders.GetHeader<SecurityHeaderType>("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
} 
+1

답장을 직접 찾은 것 같습니다. 이후 나는 다른 고용주로 전환 했으므로 코드에 더 이상 액세스 할 수 없었지만 본질적으로 동일합니다. –

관련 문제