2011-08-19 9 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サービスがあるため2行目にLVO接頭語のこのメッセージをデシリアライズすることはできません(これは、WSDLによるSTUFされている必要があります)。

私はこれらのメッセージを受け入れる私たちのWebサービスを取得したいと思います。これを行う方法はありますか?好ましくは属性を使用しますか?

答えて

1

DataContractの名前空間を変更することでこれを達成できるとは思いません。その理由は、DataMember属性では、クラスプロパティがクラス自体と同じXML名前空間にあると想定されるためです。ただし、MessageContractMessageBodyMember属性の組み合わせでこれを行うことができます。おそらくもっと簡単な別の方法は、implement a message inspectorに、予想されるXMLスキーマに準拠するようにSOAPメッセージを再フォーマットすることです。

+0

WFFのシリアル化を行います。このサービスはXML Serializationに依存しています。私は既にXmlNamespaceDeclarations属性を使用しようとしました。しかし、それは動作していないようです。 –

+1

IXmlSerializableインターフェイスを実装することで問題を解決しました。 –

+0

@WvanNoortあなたがしたことを広げることができますか?私は現時点で同じ問題を抱えています。 – Declan

1

サードパーティからのSOAPメッセージを受け取ったときにこの問題が発生しました。

<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を実現するために必要な:

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

    } 
ここ

はSOAPHEADERは私が(のUsernameToken内の異なる名前空間に注意してください)が送信されていたです

私は次のように私のヘッダーを逆シリアル化することができました:

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

あなた自身が答えを見つけたようです。私は別の雇用主に切り替えたので、もうコードにアクセスすることはできませんでしたが、これは基本的に同じでした。 –

関連する問題