Question Client SOAP en C # sans accès à un fichier WSDL


Je travaille avec une tierce partie pour intégrer certains de nos systèmes aux leurs et ils nous fournissent une interface SOAP pour effectuer certaines demandes et modifications dans leurs systèmes connectés. Le problème pour moi est qu'ils ne fournissent pas de fichier WSDL sur lequel travailler. Si j'avais un fichier WSDL, il suffirait simplement d'exécuter la commande .NET fournie (wsdl.exe) et de générer une classe 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 les paramètres que je dois envoyer et ce que je devrais attendre en retour.

Est-il courant d'avoir un service SOAP sans fichiers WSDL? (Je demande cela car nous allons ajouter plus de systèmes externes dans le futur)

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


13
2017-11-10 14:51


origine


Réponses:


string EndPoints = "http://203.189.91.127:7777/services/spm/spm";

string New_Xml_Request_String = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><OTA_AirLowFareSearchRQ EchoToken=\"0\" SequenceNmbr=\"0\" TransactionIdentifier=\"0\" xmlns=\"http://www.opentravel.org/OTA/2003/05\"><POS xmlns=\"http://www.opentravel.org/OTA/2003/05\"><Source AgentSine=\"\" PseudoCityCode=\"NPCK\"  TerminalID=\"1\"><RequestorID ID=\"\"/></Source><YatraRequests><YatraRequest DoNotHitCache=\"true\" DoNotCache=\"false\" MidOfficeAgentID=\"\" AffiliateID=\"\" YatraRequestTypeCode=\"SMPA\"/></YatraRequests></POS><TravelerInfoSummary><AirTravelerAvail><PassengerTypeQuantity Code=\"ADT\" Quantity=\"1\"/><PassengerTypeQuantity Code=\"CHD\" Quantity=\"1\"/><PassengerTypeQuantity Code=\"INF\" Quantity=\"1\"/></AirTravelerAvail></TravelerInfoSummary> <SpecificFlightInfo><Airline Code=\"\"/></SpecificFlightInfo><OriginDestinationInformation><DepartureDateTime>" + DateTime.Now.ToString("o").Remove(19, 14) + "</DepartureDateTime><OriginLocation CodeContext=\"IATA\" LocationCode=\"DEL\">" + Source + "</OriginLocation><DestinationLocation CodeContext=\"IATA\" LocationCode=\"BOM\">" + Destincation + "</DestinationLocation></OriginDestinationInformation><TravelPreferences><CabinPref Cabin=\"Economy\"/></TravelPreferences></OTA_AirLowFareSearchRQ></soapenv:Body></soapenv:Envelope>";


 protected string HttpSOAPRequest_Test(string xmlfile, string proxy)
    {
        try
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.InnerXml = xmlfile.ToString();
            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);
            string myd = r.ReadToEnd();
            return myd;
        }

   catch (Exception se)
        {
            throw new Exception("Error Occurred in AuditAdapter.getXMLDocumentFromXMLTemplate()", se);
        }
    }

7
2017-09-14 10:46



Si vous écrivez un cours qui dérive de System.Web.Services.Protocols.SoapHttpClientProtocol (et possède les attributs corrects, par exemple, WebServiceBinding, SoapDocumentMethod, etc. appliquées à elle et à ses méthodes), vous pouvez assez facilement appeler les méthodes SOAP sans avoir besoin du fichier WSDL.

Le moyen le plus simple de le faire serait probablement d’écrire votre propre service Web ASP.NET qui réplique l’API SOAP du tiers, de générer une classe de proxy, puis de modifier manuellement le fichier pour s’assurer que l’URL, les espaces de noms, les noms de méthode, le paramètre types, etc. sont corrects pour l'API tierce que vous souhaitez appeler.


4
2017-11-10 15:01



Je n'ai pas construit d'interface SOAP sans accès à un fichier WSDL, mais le format est assez bien documenté. Votre meilleur pari pourrait être de créer un fichier WSDL simplifié qui reflète ce que vous savez du service auquel vous êtes abonné.

Si vous décidez d'aller dans cette voie, un question existante de stackoverflow pointe sur certains outils pour valider votre WSDL.


1
2017-11-10 15:01



le code est ici dans 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

        <SoapMethod("processConfirmation")> _
        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("<hey>there</hey>")
envelope.SetBodyObject(doc)

Dim return_envelope As Microsoft.Web.Services3.SoapEnvelope = hc.processConfirmation(envelope)

Je pense que cela devrait marcher .... succès!


1
2018-01-05 14:57