Désérialiser un message soap
j'ai un fournisseur externe qui envoyez-moi que xml pour le 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>
Je veux deserializer donc, je n'ai
1) j'ai utilisé le xsd pour générer de classe c#
2) Créer un nouveau projet de bibliothèque de classe avec la classe de générer.
La structure
WebServicesExterns (Projet)
--> les Services (Dossier)
---> toutes les classes
exemple
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) Après avoir créer une classe de test pour essayer 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;
}
Que l'erreur
Erreur d'analyse, pas d'assemblée associé à Xml clé "AVCabeza" "_P1"
De débogage, j'ai fondé ce _P1 est égal à "http://webservices.patito/Core/"
Apparemment introuvable "Type" AVCabeza classe
Quel est le problème?
Nouvelle mise à jour
Look qui a été le fournisseur de me donner
un dossier avec structure
root
|
-- WSDL_XSD
| |-XSD
| | files with extension .xsd
| |
| --WS
| files with extension .wsdl
|-- XMLSamples
|-files with xml extension that contain soap messsages
bien je supprimer le xml (exemple précédent) de la tête
<?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>
et va essayer de l'obtenir deserializable la disponibilité de l'objet, mais ne parviennent pas cette marque
not expected "<Availability .."
maintenant dans wsdl_xsd -> ws -> ws-je voir la disponibilité existe donc, je pense que ce que la disponibilité est de conclure à availabilitydetail (requête réelle) qui est l'objet que je ne peux pas supprimer
la disponibilité de la balise parce qu'il ont de l'espace de noms spacefications pour childs tags
ce que penser?
peut-être que si je supprime la disponibilité et de l'insérer des espaces de noms (en quelque sorte) j'ai pu obtenir ma de-sérialiseur objet
OriginalL'auteur Carlos Cocom | 2011-04-26
Vous devez vous connecter pour publier un commentaire.
SoapFormatter n'est pas le Sérialiseur XML. Vous devez utiliser la classe XmlSerializer.
Aussi, c'est la totalité d'un Message SOAP. Vous feriez mieux d'avoir leur donner le WSDL et en utilisant "Ajouter une Référence de Service". Ce serait vous donner des cours en faire de la sérialisation et la désérialisation pour vous.
Si vous avez créé un proxy avec WSDL alors vous avez fait la même chose que "Ajouter une Référence Web" fait. Cela signifie que vous n'avez pas besoin de faire votre propre de sérialisation.
OriginalL'auteur John Saunders
Lorsque vous utilisez xsd.exe pour générer des classes C# à partir de ce document XML, dans la première étape, vous obtiendrez 5 individu .les fichiers xsd, en fournissant les
Schéma XSD "présumées" dans le message. (Il y a de nombreux fichiers XSD parce que vous êtes à l'aide de nombreux espaces de noms XML dans ce message)
En particulier, XSD.exe va générer du code pour décrire l'Enveloppe SOAP, y compris le corps et la tête. Ce n'est probablement pas quelque chose que vous voulez ou avez besoin de faire, mais l'xsd.exe outil déduit types pour l'ensemble du document XML.
Aussi, le moteur d'inférence dans xsd.exe est
imprécis. Par exemple, la "date de début" et "date de fin" les éléments enfants de l'Estadia élément semblent être des dates. Mais xsd.exe ne fera pas cette hypothèse; il va générer un schéma XML qui marque ces choses que chaînes. Il y a d'autres hypothèses similaires que xsd.exe fait qu'il en déduit. Dans tous les cas, vous voulez probablement modifier le générés les fichiers xsd, correspond à ce que vous attendez vraiment. Dans le cas de StartDate et EndDate, vous souhaitez modifier le type de
xs:string
àxs:dateTime
.À ce point, vous pouvez l'exécuter xsd.exe nouveau, sur le .les fichiers xsd, en utilisant le commutateur /c, à générer .cs source code. Compiler que pour obtenir des classes qui peuvent être utilisées dans la sérialisation.
De sérialiser l'aide que le code généré, vous feriez quelque chose comme ceci:
Ensuite, vous pouvez ouvrir cette Enveloppe objet et obtenir les différentes données qu'il contient.
Revenir, vous pouvez voir que vous ne devriez pas faire cela. Il est utile et pratique pour voir un exemple d'un message, pour vous montrer à quoi devrait ressembler sur le fil. Mais lors de la génération de code pour gérer les classes qui sérialiser à ces messages, il est préférable de commencer avec la source XSD - ce qui est probablement disponible à la fin des services. C'est ce que John Saunders a déclaré dans sa réponse.
Si vos gens peuvent produire un message d'exemple, ils ont probablement le XSD (ou le WSDL, qui est équivalent) pour ce message. Cela permettrait d'éliminer la nécessité pour vous d'en déduire le xsd, puis le modifier pour changer l'cassé hypothèses, via les imprécisions de processus que j'ai décrit ci-dessus.
Le seul moment où vous auriez besoin de faire est si vous en quelque sorte perdu l'original XSD/WSDL, et vous avez besoin de le régénérer.
OriginalL'auteur Cheeso