c# - titel - wordpress title tag ändern




Wie analysiere ich eine Soap-Nachricht, die aus einer Datei geladen wurde? (2)

Ich muss eine SOAP-Nachricht analysieren, die ich von der Festplatte auf den Typ des generierten Proxys geladen habe. WCF tut es, wenn es die Nachricht vom HTTP-Server empfängt, also sollte ich es von der Festplatte aus tun können.

Ich benutze einen Webservice mit WCF, ich habe den Proxy-Client von der Remote-WSDL generiert.

Hier ist die XML-Struktur, die ich vom Netzwerk erhalten habe (sie wurde mit System.ServiceModel.MessageLogging protokolliert), die ich an die generierte Klasse CRResponse analysieren möchte:

<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]">
...

Wenn ich die Operation 'GetCR' des Webdienstes aufruft, wird die Nachricht korrekt in den WCF-generierten Proxy-Client-Typ GetCRResponse konvertiert, aber ich weiß nicht, wie WCF funktioniert und ich muss die Datei von der Festplatte analysieren.

Ich habe versucht, die Nachricht so zu parsen:

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

In der GeyBody-Methode wird diese Ausnahme ausgelöst:

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

Ich habe versucht, den SoapFormatter zu verwenden:

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

..deserialize löst die folgende Ausnahme aus: Analysefehler, keine dem xml-Schlüssel 'ns2 GetCRResponse' zugeordnete Assembly.

Ich kann den XML-Serializer nicht zum Deserialisieren von "GetCRResponse" verwenden, da die Attribute SOAP-ENC: arrayType vom Soap-Serializer interpretiert werden müssen.


Sie sollten XmlSerializer verwenden XmlSerializer , um dies mithilfe SoapReflectionImporter .

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;

Die SoapReflectionImporter-Klasse stellt Typzuordnungen für SOAP-codierte Nachrichtenteile bereit, die in einem WSDL-Dokument (Web Services Description Language) definiert sind. Es wird nur verwendet, wenn ein Webdienst oder ein Client die SOAP-Codierung angibt, wie in Abschnitt 5 der SOAP 1.1-Spezifikation beschrieben.

Der folgende Befehl wurde verwendet, um Ihre Client-Verträge von WSDL zu generieren

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

Aktualisiert:

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());

Referenz





soap