2011-08-19 11 views
5

deserializing जब नियंत्रण नामस्थान एक बाहरी (जावा) ऐप हमारी वेब सेवा को संदेश भेजता है। यह संदेश कई नामस्थान शामिल हैं:डब्ल्यूसीएफ -

<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 उपसर्ग की वजह से इस संदेश को deserialize नहीं कर सकते हैं (यह डबल्यूएसडीएल के अनुसार stuf किया जाना चाहिए था)।

मैं इन संदेशों को स्वीकार करने के लिए हमारी वेब सेवा प्राप्त करना चाहता हूं। ऐसा करने का कोई तरीका है - अधिमानतः विशेषताओं का उपयोग करना?

उत्तर

1

मुझे विश्वास नहीं है कि आप डेटाकंट्रैक्ट नेमस्पेस को संशोधित करके इसे पूरा कर सकते हैं। कारण डेटामैम्बर विशेषता उचित रूप से मानती है कि कक्षा गुण एक ही एक्सएमएल नेमस्पेस में कक्षा के रूप में हैं। हालांकि, आप MessageContract और MessageBodyMember विशेषताओं के संयोजन के साथ ऐसा करने में सक्षम हो सकते हैं। उम्मीदवार एक्सएमएल स्कीमा का अनुपालन करने के लिए साबुन संदेश को दोबारा सुधारने के लिए implement a message inspector पर एक और संभवतः सरल विकल्प है।

+0

हम डी का उपयोग नहीं करते हैं efault डब्ल्यूसीएफ serialization। सेवा एक्सएमएल सीरियलाइजेशन पर निर्भर करती है। मैंने पहले से ही XmlNamespaceDeclarations विशेषता का उपयोग करने का प्रयास किया है। लेकिन यह काम नहीं लग रहा है। –

+1

IXmlSerializable इंटरफेस को लागू करके समस्या को ठीक किया गया। –

+0

@WvanNoort क्या आप अपने काम पर विस्तार कर सकते हैं? मुझे इस समय एक ही समस्या है। – Declan

1

मुझे तीसरी पार्टी से साबुन संदेश स्वीकार करते समय यह समस्या थी।

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

ठीक से deserialize मैं अपने 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

ऐसा लगता है कि आपको अपना जवाब मिल गया है। चूंकि, मैंने दूसरे नियोक्ता के लिए स्विच किया था, मुझे अब कोड तक पहुंच नहीं थी, लेकिन यह वही है जैसा मैंने किया था। –