2011-05-23 20 views
8

Tenemos un nuevo sistema de contabilidad que proporciona una interfaz de servicio web para clientes externos. Quiero acceder a una de las interfaces, pero no hay WSDL, así que creé la solicitud mediante el uso de HttpWebRequest y funciona bien..Net - Servicio web de consumo sin WSDL

Sin embargo, para facilitar la creación de las solicitudes y el análisis de la respuesta, me gustaría crear algún tipo de función de automatización. Tengo la estructura de solicitud y respuesta en un archivo XSD. ¿Algunas ideas?

creación

Solicitud:

public void SendRequest() 
{ 
    HttpWebRequest request = CreateWebRequest(); 
    XmlDocument soapEnvelopeXml = new XmlDocument(); 
    soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?> 
     <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> 
     <soap:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> 

      ++ structure type inserted here ++ 

     </soap:Body> 
     </soap:Envelope>"); 

    using (Stream stream = request.GetRequestStream()) 
    { 
     soapEnvelopeXml.Save(stream); 
    } 

    using (WebResponse response = request.GetResponse()) 
    { 
     using (StreamReader rd = new StreamReader(response.GetResponseStream())) 
     { 
      string soapResult = rd.ReadToEnd(); 
      Console.WriteLine(soapResult); 
     } 
    } 
} 
+2

Esto es interesante. ¿Has intentado llamarlos y preguntar por qué estás WSDL? –

+0

¿Ha intentado abrir el servicio web en un navegador y anexar '? Wsdl' a la URL? –

+0

Sí y sí. Lamentablemente, no hay WSDL. – Sys

Respuesta

1

Bueno, si realmente no hay manera de conseguir el asimiento de un archivo WSDL adecuado pero tienen XSD: s que probablemente se podría utilizar la herramienta xsd.exe para crear clases que se asignan a su solicitud y tipos de respuesta.

Algo como esto (ejecutar esto en un símbolo de comandos de Visual Studio)

xsd.exe TheRequest.xsd /c /n:Your.Namespace 
xsd.exe TheResponse.xsd /c /n:Your.Namespace 

Pero, en realidad, haz todo lo posible para encontrar que WSDL, que le hará la vida mucho más fácil ..

+0

¿Puede explicar cómo puedo usar la clase generada para crear HttpWebRequest? – Sys

+0

Estoy saliendo un poco de mi zona de confort aquí, pero creo que al usar XmlSerializer en las clases generadas debería obtener el "mensaje" de la solicitud/respuesta SOAP. También encontró esta entrada anterior de un grupo de noticias, puede ser de alguna ayuda: http://www.dotnet247.com/247reference/msgs/41/205010.aspx – CodingInsomnia

0

I recomendamos que Cree un WSDL - realice una ingeniería inversa, y luego genere los talones de su cliente del servicio web.

La manera de hacerlo:

  1. Obtener una traza de alambre de la solicitud y la respuesta exacta utiliza el servicio web. Use Fiddler o algo similar.

  2. Crea un servicio WCF, que aproxima la solicitud y la respuesta.

  3. Consigue el rastro de que

  4. Comparar (3) a (1). Recuerde que quiere la equivalencia XML infoset. Sus prefijos de espacio de nombres no necesitan ser los mismos, por ejemplo. Sus espacios de nombres no necesitan ser declarados en el mismo lugar. Pero los nombres de los elementos deben ser exactamente iguales y las cadenas xmlns deben ser exactamente iguales. Modifique el servicio WCF para que coincida más con el original. Reinícialo, ve al paso 3. Itera tantas veces como sea necesario.

  5. punto de su cliente WCF para el servicio web de bienes

  6. sentarse y relajarse.

He hecho esto y funciona. Puede ser complicado si no tiene una idea de cómo los atributos DataContract afectan el XML en el cable. Pero a medida que juegas con él, obtendrás la idea bastante rápido.

Pero, ¿cómo es posible que sea un servicio SOAP y que no haya WSDL en el lado del servicio? Puede ahorrarle mucho trabajo duplicar sus esfuerzos para ubicar el WSDL real.

Cuestiones relacionadas