partir - Cliente SOAP en C#sin acceso a un archivo WSDL
create wsdl c# (4)
Si escribe una clase que se deriva de System.Web.Services.Protocols.SoapHttpClientProtocol
(y tiene los atributos correctos, por ejemplo, WebServiceBinding
, SoapDocumentMethod
, etc. aplicados a ella y sus métodos), puede llamar fácilmente a los métodos SOAP sin necesidad de Archivo WSDL
La forma más sencilla de hacer esto sería escribir su propio servicio web ASP.NET que replique la API SOAP del tercero, generar una clase proxy y editar manualmente el archivo para asegurarse de que la URL, los espacios de nombres, los nombres de los métodos, los parámetros tipos, etc. son correctos para la API de terceros a la que desea llamar.
Estoy trabajando con un tercero para integrar algunos de nuestros sistemas con los suyos y ellos nos proporcionan una interfaz SOAP para realizar ciertas solicitudes y cambios en sus sistemas conectados. El problema para mí es que no me proporcionan un archivo WSDL para que trabaje en contra. Si tuviera un archivo WSDL, sería una simple cuestión simplemente ejecutar el comando .NET suministrado (wsdl.exe) y generar una clase proxy para interactuar con el servicio.
¿Hay una manera "fácil" de hacer esto sin un archivo WSDL? Tengo todas las funciones a las que podemos acceder y los parámetros que necesito enviar y lo que debería esperar a cambio.
¿Es común tener un servicio SOAP sin archivos WSDL? (Pregunto esto porque vamos a agregar más sistemas externos a la mezcla en el futuro)
¿Alguien ha hecho una clase proxy o cualquier otra forma de cliente contra un servicio sin WDSL y tiene algún buen consejo sobre cómo hacerlo?
el código aquí está en VB.NET, pero creo que tendrás la idea. El siguiente es un cliente que invoca el método ''processConfirmation'' y espera una respuesta (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
Y lo usa haciendo lo siguiente:
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)
Creo que esto debería funcionar ... ¡éxito!
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);
}
}
No he creado una interfaz SOAP sin acceso a un archivo WSDL, pero el formato está bastante bien documentado . Su mejor opción podría ser crear un archivo WSDL simplificado que refleje lo que sabe sobre el servicio al que se está suscribiendo ...
Si decide seguir esta ruta, una pregunta sobre el existente apunta a algunas herramientas para validar su WSDL.