Envelopper XML dans l'enveloppe SOAP .net
J'ai besoin d'aide avec l'enchaînement d'un fichier XML dans une enveloppe SOAP pour un tiers d'un serveur SOAP. La troisième partie a fourni les fichiers xsd pour la requête entrante et sortante de la réponse. J'ai pris les fichiers XSD et créé des classes C# à l'aide de l'outil xsd. Mon problème est que j'ai besoin d'envelopper le sérialisé demande avec une enveloppe SOAP et je ne sais pas par où commencer. Je regardais le site de Microsoft, des Améliorations de Service 3, mais qui dit que c'est seulement pour .net 2.0 et VS2005. Je suis avec VS2012 et .net 4.5. Aussi, j'ai regardé dans la connexion au serveur par le biais du service web, mais il ne semble pas compatible et ne dispose pas d'un WSDL.
Ce qui suit est un échantillon de ce que le serveur SOAP en attend une requête entrante.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Body>
<GetBasicData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="CRS610MI">
<CONO xmlns="">1</CONO>
<CUNO xmlns="">12345</CUNO>
</GetBasicData>
</soap:Body>
</soap:Envelope>
C'est ce que le XML sérialisé chaîne ressemble.
<?xml version="1.0" encoding="utf-8"?>
<GetBasicData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="CRS610MI">
<CONO xmlns="">1</CONO>
<CUNO xmlns="">12345</CUNO>
</GetBasicData>
Code que j'utilise pour mon site web de demande et de réponse.
Byte[] byteArray = System.Text.UTF8Encoding.UTF8.GetBytes(data);
WebRequest webRequest = WebRequest.Create(@"http://myserver:8888");
webRequest.ContentLength = byteArray.Length;
webRequest.ContentType = @"text/xml; charset=utf-8";
webRequest.Headers.Add("SOAPAction", @"http://schemas.xmlsoap.org/soap/envelope/");
webRequest.Method = "POST";
Stream requestStream = webRequest.GetRequestStream();
requestStream.Write(byteArray, 0, byteArray.Length);
requestStream.Close();
requestStream.Dispose();
WebResponse webResponse = webRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream);
String line;
while ((line = streamReader.ReadLine()) != null)
{
Debug.WriteLine(line);
}
J'ai testé mon code en remplaçant ma chaîne sérialisée avec le texte dans le fichier d'exemple fourni par le tiers et il a fonctionné comme prévu. J'ai aussi pris ma chaîne sérialisée et inséré le texte enveloppe dans les endroits corrects et qui a également travaillé, demande web a passé et j'ai obtenu la réponse que je cherchais. À court d'insérer l'enveloppe du texte dans ma chaîne sérialisée manuellement ce que je peux faire. Je imagine qu'il y a une méthode ou d'une classe qui se charge de cela pour moi, d'une manière standardisée?
BTW, êtes-vous bien il n'y a pas de WSDL pour le service? Essayez d'utiliser un navigateur, et la navigation à l'adresse du service. Si cela ne fonctionne pas, essayez d'ajouter
?wsdl
à la fin de l'URL du service.
OriginalL'auteur Matthew | 2014-02-26
Vous devez vous connecter pour publier un commentaire.
Si le prestataire ne fournit pas un WSDL, alors vous ne devriez pas faire des affaires avec eux. Ce n'est pas la science de fusée, et c'est la façon standard que les services SOAP web travail. C'est seulement a été une norme pour le plus d'une décennie. Je me demande sérieusement dans quelle autre manière ce fournisseur de services est incompétent.
Si vous n'avez pas le choix mais pour faire des affaires avec des incompétents, partenaires d'affaires, puis
Pourquoi a-t-il besoin d'être mis à jour? Pourquoi n'a t il pas avoir un WSDL pour commencer? Je veux dire, vraiment, WSDL a été une partie de SAVON depuis le début. Peut-être qu'ils ont simplement perdu le WSDL? Ou, si vous connaissez le service assez bien pour essayer de truquer une enveloppe à la main, peut-être vous pouvez créer un fichier WSDL qui fera la même chose? Ensuite, vous pouvez donner un prestataire de service, le don de le WSDL.
Parfois, à l'aide de la crue du savon échange est nécessaire lorsque le WSDL est encore un autre interop en panne entre Java et .NET, et vous ne pouvez pas obtenir le fournisseur à modifier, car "il fonctionne dans soapUI et eclipse".
OriginalL'auteur John Saunders
J'ai été en mesure de résoudre ce problème en utilisant un XLST pour envelopper le XML dans le savon.
Voici mon travail de test de code de l'application
Et voici le code XSL
OriginalL'auteur Matthew
Je ne comprends pas pourquoi certains sont si résolue que vous devez utiliser le fichier WSDL. Le WSDL est tout simplement de sorte que vous pouvez appeler leurs méthodes, et l'utilisation de leurs entités, et il est facultatif.
J'ai eu à travailler en allant à l'url exacte de leur service, comme
https://something.com/SomeService/TheService.asmx?method=DoSomething
Et juste analyse de l'en-tête exact et XML leurs API définit, y compris l'enveloppe SOAP. La première section devrait être les informations d'en-tête, puis-dessous qui est le XML. Créer le XML exactement comment ils précisent, y compris l'enveloppe des balises. Pour l'en-Tête: la POSTE, l'Hôte, le Type de Contenu et SOAPAction, sont les plus importants. J'ai trouvé que certains serveurs n'avez pas besoin de Contenu de Longueur, même si sa liste dans leur API.
Voici un exemple de code
OriginalL'auteur Mauro Torres
Vous devez marquer votre classe avec MessageContract pour le savon
Je ne suis pas devant le PC donc je ne peux pas vous donner exige, toutefois, si vous google c# Message soap.CreateMessage va voir quoi faire.
OriginalL'auteur TYY