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 ?
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
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
Was ist * eine Antwort von einem Webservice-Anruf des Webclient-Clients *? Meinst du eine WCF Service Antwort? –