2017-05-02 2 views
10

Wenn ich eine Web-Service-Operation aufruft, deserialisiert WCF die Nachricht an die Proxy-Klasse mit dem DataContractSerializer: Warum konnte ich das nicht tun? HierWie kann eine WCF-Soap-Antwortnachricht aus einer Datei mit DataContractSerializer deserialisiert werden?

ist die Seife Nachricht in der Datei ActLoginResponse.xml:

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

Der WCF-Proxy-Code für die entsprechende ActLoginResponse Klasse:

[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; 
    } 
} 

Also ich brauche die XML ein analysieren Objektinstanz des Typs ActLoginResponse.

Hier ist, wie ich die Analyse durchführen:

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

Das actLogin Objekt wird erstellt, aber der Inhalt actLogin.return ist immer NULL! Habe ich etwas verpasst ?

+0

Haben Sie die Eigenschaften der LoginResponseType Klasse definiert haben? Wenn nicht, wird es nicht in der Lage sein, die Werte vom XML zum Objekt zu deserialisieren. – Popo

+0

Ja Alle Eigenschaften sind definiert, da LoginResponseType eine Klasse ist, die generiert wird, wenn die WSDL als Dienst referenziert wird. Wenn ich den Web-Service verwende, wird LoginResponseType aus den vom Netzwerk empfangenen SOAP-Antworten deserialisiert. Ich möchte dasselbe aus einer Datei machen. – abreneliere

+0

Was ist * eine Antwort von einem Webservice-Anruf des Webclient-Clients *? Meinst du eine WCF Service Antwort? –

Antwort

2

Sie sollten XmlSerializer verwenden können, um dies mit Hilfe von SoapReflectionImporter zu erreichen.

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; 

Die SoapReflectionImporter Klasse stellt Typzuordnungen zu SOAP-codierten Nachricht Teile, wie in einem Web Service Description Language (WSDL) Dokument definiert. Es wird nur verwendet, wenn ein Web-Service oder Client SOAP-Codierung angibt, wie in Abschnitt 5 der SOAP 1.1 Spezifikation beschrieben.

wurde der folgende Befehl verwendet, um Ihre Kundenverträge von WSDL

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

mir die WSDL verwendet, um generieren Sie von der anderen Frage und erstellt eine Proxy-Klasse von ihm zur Verfügung gestellt hatten.

die oben XML verwenden, scheinen ich Deserialisieren in die ActLoginResponse durch die folgende keine Probleme zu haben:

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

Verwandte Themen