2008-11-10 25 views
13

Estoy trabajando con un tercero para integrar algunos de nuestros sistemas con los suyos y 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.Cliente SOAP en C# sin acceso a un archivo WSDL

¿Existe una manera "fácil" de hacerlo 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 un buen servicio consejos sobre cómo hacerlo?

+0

Estoy en el mismo barco ahora ... ¿encontró alguna forma de hacerlo? –

+0

Lamentablemente no. Resultó que el SOAP al que intentaba acceder tampoco era válido en muchas otras formas, por lo que el proyecto se eliminó. –

Respuesta

1

No he creado una interfaz SOAP sin acceso a un archivo WSDL, pero el formato es fairly well-documented. Su mejor opción podría ser crear un archivo WSDL simplificado propio que refleje lo que sabe del servicio al que se está suscribiendo ...

Si decide seguir esta ruta, un existing stackoverflow question apunta a algunas herramientas para validando su WSDL.

4

Si se escribe una clase que deriva de System.Web.Services.Protocols.SoapHttpClientProtocol (y tiene los atributos correctos, por ejemplo, WebServiceBinding, SoapDocumentMethod, etc. que se le aplica y sus métodos), puede llamar a métodos SOAP con bastante facilidad sin necesidad del archivo WSDL.

La manera más fácil de hacer esto sería probablemente escribir su propio servicio web ASP.NET que replique la API SOAP del tercero, generar una clase proxy de él, luego editar manualmente el archivo para asegurarse de que la URL, los espacios de nombres, los nombres de métodos, tipos de parámetros, etc. son correctos para la API de terceros a la que desea llamar.

1

el código aquí está en VB.NET, pero creo que ya entenderá. 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 utiliza de la siguiente manera:

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!

+0

-1: Esto requiere WSE 3.0, que está obsoleto, y no debe usarse a menos que no haya otras opciones. –

7
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); 
     } 
    }