Client SOAP en C # sans access à un fichier WSDL

Je travaille avec un tiers pour intégrer certains de nos systèmes aux siens et ils nous fournissent une interface SOAP pour effectuer certaines demandes et modifier certains systèmes connectés. Le problème pour moi est qu’ils ne fournissent pas de fichier WSDL contre lequel travailler. Si j’avais un fichier WSDL, ce serait une tâche simple d’exécuter la commande .NET fournie (wsdl.exe) et de générer une classe de proxy pour interagir avec le service.

Existe-t-il un moyen “facile” de le faire sans fichier WSDL? J’ai toutes les fonctions auxquelles nous pouvons accéder et quels parameters je dois envoyer et ce à quoi je devrais m’attendre en retour.

Est-il courant d’avoir un service SOAP sans fichiers WSDL? (Je vous pose cette question car nous allons append plus de systèmes externes dans le mix à l’avenir)

Quelqu’un a-t-il utilisé une classe de proxy ou une autre forme de client contre un service sans WDSL et a-t-il de bons conseils sur la façon de le faire?

ssortingng EndPoints = "http://203.189.91.127:7777/services/spm/spm"; ssortingng New_Xml_Request_Ssortingng = " " + DateTime.Now.ToSsortingng("o").Remove(19, 14) + "" + Source + "" + Destincation + ""; protected ssortingng HttpSOAPRequest_Test(ssortingng xmlfile, ssortingng proxy) { try { System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.InnerXml = xmlfile.ToSsortingng(); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(EndPoints); req.Timeout = 100000000; if (proxy != null) req.Proxy = new WebProxy(proxy, true); req.Headers.Add("SOAPAction", ""); req.ContentType = "application/soap+xml;charset=\"utf-8\""; req.Accept = "application/x-www-form-urlencoded"; //"application/soap+xml"; req.Method = "POST"; Stream stm = req.GetRequestStream(); doc.Save(stm); stm.Close(); WebResponse resp = req.GetResponse(); stm = resp.GetResponseStream(); StreamReader r = new StreamReader(stm); ssortingng myd = r.ReadToEnd(); return myd; } catch (Exception se) { throw new Exception("Error Occurred in AuditAdapter.getXMLDocumentFromXMLTemplate()", se); } } 

Si vous écrivez une classe qui dérive de System.Web.Services.Protocols.SoapHttpClientProtocol (et possède les atsortingbuts appropriés, par exemple, WebServiceBinding , SoapDocumentMethod , etc. appliqués à cette méthode et à ses méthodes), vous pouvez assez facilement appeler des méthodes SOAP sans avoir besoin du Fichier WSDL.

La méthode la plus simple consiste probablement à écrire votre propre service Web ASP.NET qui réplique l’API SOAP du tiers, à générer une classe de proxy à partir de celle-ci, puis à modifier manuellement le fichier pour vous assurer que l’URL, les espaces de noms, les noms de méthodes, le paramètre. les types, etc. sont corrects pour l’API tierce que vous souhaitez appeler.

Je n’ai pas construit d’interface SOAP sans access à un fichier WSDL, mais le format est assez bien documenté . Votre meilleur choix pourrait être de créer votre propre fichier WSDL simplifié qui reflète ce que vous savez du service auquel vous vous abonnez ….

Si vous décidez d’emprunter cette voie, une question existante de stackoverflow pointe sur certains outils de validation de votre WSDL.

le code ici est en VB.NET mais je pense que vous aurez l’idée. Voici un client qui appelle la méthode ‘processConfirmation’ et attend une réponse (MyBase.SendRequestResponse).

 Imports Microsoft.Web.Services3 Imports Microsoft.Web.Services3.Addressing Imports Microsoft.Web.Services3.Messaging Namespace Logic Public Class HTTPClient Inherits Soapclient Sub New(ByVal destination As EndpointReference) MyBase.Destination = destination End Sub  _ Public Function processConfirmation(ByVal envelope As SoapEnvelope) As SoapEnvelope Return MyBase.SendRequestResponse("processConfirmation", envelope) End Function End Class End Namespace 

Et vous l’utilisez en procédant comme suit:

 Dim hc As New HTTPClient(New Microsoft.Web.Services3.Addressing.EndpointReference(New System.Uri("http://whatever.srv"))) Dim envelope As New Microsoft.Web.Services3.SoapEnvelope Dim doc As New Xml.XmlDocument doc.LoadXml("there") envelope.SetBodyObject(doc) Dim return_envelope As Microsoft.Web.Services3.SoapEnvelope = hc.processConfirmation(envelope) 

Je pense que cela devrait fonctionner …. succès!