2011-08-19 35 views
5

外部(Java)應用程序將消息發送到我們的Web服務。此消息包含多個命名空間: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已經塞入)。

我想讓我們的Web服務接受這些消息。有沒有辦法做到這一點 - 最好使用屬性?

回答

1

我不相信你可以通過修改DataContract命名空間來完成。原因是DataMember屬性合理地假定類屬性與類本身在同一個XML名稱空間中。但是,您可以使用MessageContractMessageBodyMember屬性的組合來完成此操作。另一個可能更簡單的替代方法是implement a message inspector重新設置soap消息的格式以符合預期的XML模式。

+0

我們不使用d默認的WCF序列化。該服務依賴於XML序列化。我已經嘗試使用XmlNamespaceDeclarations屬性。但這似乎並不奏效。 –

+1

通過實現IXmlSerializable接口來修復問題。 –

+0

@WvanNoort你可以擴展你做了什麼?我現在有同樣的問題。 – Declan

1

我在接受來自第三方的肥皂郵件時遇到此問題。

這裏是SOAPHEADER我被送到(注中的UsernameToken不同的命名空間):

<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> 

反序列化正確的,我需要實現IXmlSerializable的,在我的DataContract,如下圖所示:

[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"];   

    } 

我當時能夠反序列化我的標題如下:

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

看起來你已經找到了自己的答案。因爲,我轉向了另一個僱主,我再也無法訪問該代碼了,但這與我所做的基本相同。 –

相關問題