c# किसी फ़ाइल से लोड किए गए साबुन संदेश को कैसे पार्स करना है?




xml web-services (2)

मुझे डिस्क से लोड किए गए SOAP संदेश को पार्स करने की आवश्यकता है, उत्पन्न प्रॉक्सी के प्रकार के लिए WCF ऐसा करता है जब यह HTTP सर्वर से संदेश प्राप्त करता है, तो मैं इसे डिस्क से करने में सक्षम होना चाहिए

मैं WCF के साथ एक webservice का उपयोग करता हूं, मैंने प्रॉक्सी क्लाइंट को दूरस्थ WSDL से जनरेट किया

यहां नेटवर्क से प्राप्त XML संरचना है (यह System.ServiceModel.MessageLogging के साथ लॉग किया गया था) कि मैं उत्पन्न वर्ग CRResponse के लिए पार्स करना चाहता हूँ .:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:PourtuIntf" xmlns:ns2="ns2:PourtuIntf-IPourtu">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <ns2:GetCRResponse>
         <return>
            <ResultCode>0</ResultCode>
            <CR>
               <Theme SOAP-ENC:arrayType="ns1:ItemType[5]">
                  <item>
                     <Key/>
                     <Section SOAP-ENC:arrayType="ns1:Section[3]">
...

जब मैं वेब सेवा के ऑपरेशन 'GetCR' को कॉल करता हूं, तो संदेश सही रूप से WCF उत्पन्न प्रॉक्सी क्लाइंट प्रकार GetCRResponse में परिवर्तित हो गया है, लेकिन मैं नहीं जानता कि WCF कैसे काम करता है और मुझे डिस्क से फ़ाइल को पार्स करने की आवश्यकता है I

मैंने इस तरह संदेश को पार्स करने की कोशिश की:

  GetCRResponse body;
  using (var xmlReader =  XmlReader.Create("Requests\\CR.xml"))
  {
      Message m = Message.CreateMessage(xmlReader, int.MaxValue, MessageVersion.Soap11);
      body = m.GetBody<GetCRResponse>();
  }

GeyBody विधि में यह अपवाद उठाया गया है:

Expected element 'ActGetCRResponse' from namespace 'http://schemas.datacontract.org/2004/07/Pourtu.PourtuClient'.. Detecting 'Element' with name 'ActGetCRResponse', namespace 'urn:PourtuIntf-IPourtu'

मैंने सोपफार्मर का प्रयोग करने की कोशिश की:

using ( FileStream fs = new FileStream("Requests\\CR.xml", FileMode.Open) )
{
    SoapFormatter formatter = new SoapFormatter();
    body = (ActGetCRResponse)formatter.Deserialize(fs);
}

..देशीयकरण निम्न अपवाद फेंकता है: विश्लेषण त्रुटि, xml कुंजी 'ns2 getCRResponse' से जुड़ी किसी भी विधानसभा नहीं है

मैं एसएपी-ईएनसी: सरणी प्रकार को साबुन धारावाहिक द्वारा व्याख्या किए जाने की ज़रूरत के लिए GetRRPasspace Beceause के लिए deserialize करने के लिए XML serializer का उपयोग नहीं कर सकता।


अपडेट किया गया:

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(ActGetCRResponse));
            XmlSerializer xmlSerializer = new XmlSerializer(mapp); 
            var o = (ActGetCRResponse)xmlSerializer.Deserialize(m.GetReaderAtBodyContents());

संदर्भ


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

var importer = new SoapReflectionImporter("ns2:PourtuIntf-IPourtu");
var mapping = importer.ImportTypeMapping(typeof(GetCRResponse));
var serializer = new XmlSerializer(mapping);
var response = serializer.Deserialize(reader) as GetCRResponse;

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

WSDL से अपने ग्राहक अनुबंधों को उत्पन्न करने के लिए निम्न कमांड का उपयोग किया गया था

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






soap