Deserialisieren einer soap-Nachricht
habe ich einen Anbieter extern, senden Sie mir, dass xml für den test
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<AVCabeza transactionID="000032" xmlns="http://webservices.patito/Core/">
<Solicitor entityID="WEST" systemType="WEB" />
</AVCabeza>
</soap:Header>
<soap:Body>
<Availability xmlns:a="http://webservices.patito/Availability/"
xmlns:hc="http://webservices.patito/Common/" summaryOnly="true"
xmlns="http://webservices.patito/og/Availability.wsdl">
<a:AvailabilityDetail availReqType="Room">
<a:Estadia>
<hc:StartDate>2009-01-05T00:00:00.0000000-05:00</hc:StartDate>
<hc:EndDate>2009-01-06T00:00:00.0000000-05:00</hc:EndDate>
</a:Estadia>
<a:HotelSearchCriteria>
<a:HotelRef chainCode="WC"/>
</a:HotelSearchCriteria>
</a:AvailabilityDetail>
</Availability>
</soap:Body>
</soap:Envelope>
Möchte ich deserializer so hab ich es
1) ich habe die xsd für das generieren von c# - Klasse
2) Erstellen Sie ein neues Projekt Klassenbibliothek mit der Klasse erzeugen.
Die Struktur
WebServicesExterns (Projekt)
--> Dienste (Ordner)
---> alle Klasse
Beispiel
namespace WebServicesExterns.Services
<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42"), _
System.SerializableAttribute(), _
System.Diagnostics.DebuggerStepThroughAttribute(), _
System.ComponentModel.DesignerCategoryAttribute("code"), _
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://webservices.patito/Availability.wsdl")> _
Partial Public Class Availability
'''<comentarios/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42"), _
System.SerializableAttribute(), _
System.Diagnostics.DebuggerStepThroughAttribute(), _
System.ComponentModel.DesignerCategoryAttribute("code"), _
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://webservices.patito/Core/"), _
System.Xml.Serialization.XmlRootAttribute([Namespace]:="http://webservices.patito/Core/", IsNullable:=false)> _
Partial Public Class AVCabeza
3) Nach erstellen einer test-Klasse für versuchen deserializer
using WebServicesExterns.Services;
using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
using NUnit.Framework;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Soap;
[Test()]
public void ShouldDeserializerSoapMessage()
{
var message = SoapToFromFile(@"C:\rq\Availability.xml");
Assert.IsNotNull(message);
}
public object SoapToFromFile(string filePath)
{
IFormatter formatter;
FileStream fileStream = null;
Object objectFromSoap = null;
try
{
fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
formatter = new SoapFormatter();
objectFromSoap = formatter.Deserialize(fileStream);
}
catch (Exception exception)
{
throw exception;
}
finally
{
if (fileStream != null) fileStream.Close();
}
return objectFromSoap;
}
So, zurück, die Fehler
Parse Error, keine Montage im Zusammenhang mit Xml-key "AVCabeza" "_P1"
Debugging gründete ich, was _P1 ist gleich "http://webservices.patito/Core/"
Anscheinend nicht gefunden "Typ" AVCabeza Klasse
Was ist falsch?
Neues update
Sich der Anbieter mir
einem Ordner mit der Struktur
root
|
-- WSDL_XSD
| |-XSD
| | files with extension .xsd
| |
| --WS
| files with extension .wsdl
|-- XMLSamples
|-files with xml extension that contain soap messsages
gut ich lösche die xml - (vorherigen Beispiel) die Kopf
<?xml version="1.0" encoding="utf-8"?>
<Availability xmlns:a="http://webservices.patito/Availability/"
xmlns:hc="http://webservices.patito/Common/" summaryOnly="true"
xmlns="http://webservices.patito/og/Availability.wsdl">
<a:AvailabilityDetail availReqType="Room">
<a:Estadia>
<hc:StartDate>2009-01-05T00:00:00.0000000-05:00</hc:StartDate>
<hc:EndDate>2009-01-06T00:00:00.0000000-05:00</hc:EndDate>
</a:Estadia>
<a:HotelSearchCriteria>
<a:HotelRef chainCode="WC"/>
</a:HotelSearchCriteria>
</a:AvailabilityDetail>
</Availability>
und wird versuchen, sich deserializable Verfügbarkeit Objekt, aber nicht diese Marke
not expected "<Availability .."
nun in wsdl_xsd -> ws -> ws sehe ich die Verfügbarkeit gibt, so denke ich, was ist die Verfügbarkeit wickeln zu availabilitydetail (echte Anfrage), welches das Objekt ist, das kann ich nicht löschen
Verfügbarkeit tag, weil es-namespace spacefications für Kinder von tags
was denken Sie darüber?
vielleicht, wenn ich es löschen Sie die Verfügbarkeit und einfügen namespaces (irgendwie), ich könnte meine de-serializer-Objekt
InformationsquelleAutor Carlos Cocom | 2011-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
SoapFormatter ist nicht auf den XML-Serializer. Sollten Sie die XmlSerializer-Klasse.
Dies ist auch eine komplette SOAP-Nachricht. Sie wären besser dran mit Ihnen geben Sie die WSDL-und mit "Add Service Reference". Dies würde Ihnen die Klassen, die die Serialisierung und Deserialisierung für Sie.
Wenn Sie einen proxy mit WSDL-dann haben Sie die gleiche Sache als "Add Web Reference". Dies bedeutet, dass Sie nicht brauchen, um Ihre eigene Serialisierung.
InformationsquelleAutor John Saunders
Wenn Sie xsd.exe zum generieren von C# - Klassen aus XML-Dokument, in dem ersten Schritt erhalten Sie 5 einzelne .xsd-Dateien, die Bereitstellung der
XSD-Schema "abgeleitet" von der Nachricht. (Es gibt zahlreiche XSD-Dateien, da Sie zahlreiche XML-namespaces, die in dieser Nachricht)
Insbesondere XSD.exe wird code generiert, um zu beschreiben, dem SOAP-Envelope, einschließlich der Körper und Kopf. Dies ist wahrscheinlich nicht etwas, was Sie wollen oder tun müssen, aber die xsd.exe tool leitet Arten für das gesamte XML-Dokument.
Auch die Inferenz-engine innerhalb xsd.exe ist
ungenau. Zum Beispiel, "StartDate" und "EndDate" Kind-Elemente des Estadia-element angezeigt werden dates. Aber xsd.exe nicht, dass diese Annahme; es wird ein XML-schema generiert wird, markiert diese Dinge als strings. Es sind andere, ähnliche Annahmen, dass xsd.exe macht, wie es entnimmt. In allen Fällen werden Sie wahrscheinlich wollen, ändern Sie den generierten xsd-Dateien, die entsprechen, was Sie wirklich erwarten. Im Fall von StartDate und EndDate, die Sie möchten, ändern Sie den Typ von
xs:string
zuxs:dateTime
.In diesem Punkt kann man laufen xsd.exe wieder, auf die .xsd-Dateien mit der Option /c, zu erzeugen .cs source code. Kompilieren , dass zu bekommen-Klassen, die verwendet werden können in der Serialisierung.
Zu de-serialisieren mit, dass der generierte code, würde man etwas wie das hier tun:
Dann öffnen Sie das Envelope-Objekt und den verschiedenen Daten innerhalb es.
Schritt zurück, sehen Sie, dass Sie wahrscheinlich sollte nicht dabei sein. Es ist nützlich und praktisch, um zu sehen, eine Probe-Nachricht, um Ihnen zu zeigen, was die Dinge sollten so Aussehen wie auf dem Draht. Aber beim generieren von code zum behandeln von Klassen, die serialisiert werden, um diese Nachrichten, es ist besser, beginnen mit der Quelle XSD - das ist wohl verfügbar in den Dienst beenden. Dies ist, was John Saunders sagte in seiner Antwort.
Wenn Ihr Menschen produzieren können, eine Probe-Nachricht, wahrscheinlich haben Sie die XSD (oder die WSDL, die äquivalent sind) für die Nachricht. Dies würde beseitigen die Voraussetzung für Sie, um zu folgern, der xsd -, und dann ändern Sie es zu änderung die gebrochen Annahmen, über die zu ungenau Prozess, den ich oben beschrieben.
Die einzige Zeit, die Sie würde tun müssen, wenn Sie irgendwie verloren die original-XSD/WSDL, und Sie brauchte, um sich zu regenerieren.
InformationsquelleAutor Cheeso