2017-05-02 7 views
10

जब मैं एक वेब सेवा ऑपरेशन कहता हूं, डब्ल्यूसीएफ डेटाकंट्रैक्टसेरियलाइज़र के साथ प्रॉक्सी क्लास को संदेश deserializes: मैं ऐसा क्यों नहीं कर सकता?DataContractSerializer के साथ एक फ़ाइल से डब्ल्यूसीएफ साबुन प्रतिक्रिया संदेश deserialize कैसे?

<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:PlotiIntf" xmlns:ns2="urn:PlotiIntf-IPloti" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"/> 
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <ns2:ActLoginResponse> 
      <return> 
       <ResultCode>0</ResultCode> 
       <ResultMessage>Login et password correct.</ResultMessage> 
       <Acteur> 
        <Id>IMT_706</Id> 
        <Nom>IMA PROTECT</Nom> 
        <Prenom/> 
        <nbFI>0</nbFI> 
        <FonctionActeur>TS</FonctionActeur> 
        <Timeout>30</Timeout> 
       </Acteur> 
       <ZneGeoList xsi:nil="true"/> 
      </return> 
     </ns2:ActLoginResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

इसी ActLoginResponse वर्ग के लिए WCF प्रॉक्सी कोड है::

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.ServiceModel.MessageContractAttribute(WrapperName="ActLoginResponse", WrapperNamespace="urn:PlotiIntf-IPloti", IsWrapped=true)] 
public partial class ActLoginResponse { 

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)] 
    public Ploti.PlotiClient.LoginResponseType @return; 

    public ActLoginResponse() { 
    } 

    public ActLoginResponse(Ploti.PlotiClient.LoginResponseType @return) { 
     [email protected] = @return; 
    } 
} 

तो मैं एक करने के लिए XML पार्स करने के लिए की जरूरत है

यहाँ फ़ाइल ActLoginResponse.xml में साबुन संदेश है ActLoginResponse प्रकार का ऑब्जेक्ट उदाहरण।

यहाँ कैसे मैं पार्स प्रदर्शन है:

 ActLoginResponse body; 
     FileStream stream = new FileStream("Requests\\ActLoginResponse.xml", FileMode.Open); 
     XmlReader xmlReader = XmlReader.Create(stream); 

     xmlReader.MoveToContent(); 
     xmlReader.ReadStartElement(); 
     xmlReader.MoveToContent(); 
     xmlReader.ReadStartElement(); 
     xmlReader.MoveToContent(); 
     xmlReader.ReadStartElement(); 
     xmlReader.MoveToContent(); 

     // the the reader is on the element ActLoginResponse (that is confirmed by a Log.Debug(xmlReader.ReadOuterXml()); 

     // I create The DataContractSerializer: exception if nampespace is not specified 
     DataContractSerializer dataContract = new `DataContractSerializer`(typeof(ActLoginResponse), "ActLoginResponse", "urn:PlotiIntf-IPloti"); 

     ActLoginResponse actLogin = dataContract.ReadObject(xmlReader, true); 

actLogin वस्तु बनाई गई है, लेकिन सामग्री actLogin.return allways शून्य है! क्या मैं कुछ भुल गया ?

+0

आप LoginResponseType वर्ग के गुणों परिभाषित है? यदि नहीं तो यह xml से ऑब्जेक्ट में मानों को deserialize करने में सक्षम नहीं होगा। – Popo

+0

हां सभी गुणों को परिभाषित किया गया है क्योंकि LoginResponseType एक वर्ग के रूप में डब्लूएसडीएल को संदर्भित करते समय उत्पन्न कक्षा है। जब मैं वेब सेवा का उपयोग करता हूं LoginResponseType नेटवर्क से प्राप्त SOAP प्रतिक्रियाओं से deserialized है। मैं एक फाइल से एक ही bu करना चाहता हूँ। – abreneliere

+0

* एक डब्ल्यूसीएफ क्लाइंट webservice कॉल * से प्रतिक्रिया क्या है? क्या आपका मतलब डब्लूसीएफ सेवा प्रतिक्रिया है? –

उत्तर

2

SoapReflectionImporter की सहायता से इसे पूरा करने के लिए आपको XmlSerializer का उपयोग करने में सक्षम होना चाहिए।

var importer = new SoapReflectionImporter("urn:PlotiIntf-IPloti"); 
var mapping = importer.ImportTypeMapping(typeof(ActLoginResponse)); 
var serializer = new XmlSerializer(mapping); 
var response = serializer.Deserialize(reader) as ActLoginResponse; 

SoapReflectionImporter वर्ग के रूप में एक वेब सेवा विवरण लैंग्वेज (WSDL) दस्तावेज़ में परिभाषित किया गया, सोप एन्कोड संदेश भागों में प्रकार मैपिंग प्रदान करता है। इसका उपयोग तब किया जाता है जब एक वेब सेवा या क्लाइंट SOAP 1.1 विनिर्देश के खंड 5 में वर्णित अनुसार SOAP एन्कोडिंग निर्दिष्ट करता है।

निम्न आदेश मैं डबल्यूएसडीएल आप अन्य प्रश्न से मुहैया कराई थी इस्तेमाल किया और इसे से एक प्रॉक्सी श्रेणी का निर्माण डबल्यूएसडीएल

SvcUtil.exe IPlotiservice.wsdl /t:code /serviceContract 
3

से अपने ग्राहक ठेके उत्पन्न करने के लिए इस्तेमाल किया गया था।

ऊपर एक्सएमएल का उपयोग करना, मैं पालन करके ActLoginResponse में deserializing कोई मुद्दा नहीं है लगता है:

Message m = Message.CreateMessage(XmlReader.Create("C:\\testSvc\\login.xml"), int.MaxValue, MessageVersion.Soap11); 
SoapReflectionImporter importer = new SoapReflectionImporter(new SoapAttributeOverrides(), "urn:PlotiIntf-IPloti"); 
XmlTypeMapping mapp = importer.ImportTypeMapping(typeof(ActLoginResponse)); 
XmlSerializer xmlSerializer = new XmlSerializer(mapp); //typeof(T), xr 
var o = (ActLoginResponse)xmlSerializer.Deserialize(m.GetReaderAtBodyContents()); 

reference

संबंधित मुद्दे