2010-06-04 10 views
5

Estoy tratando de escribir una función que pueda llamar a un webmethod desde un webserive dado el nombre del método y la URL del servicio web. Encontré un código en un blog que lo hace bien excepto por un detalle. Requiere que se proporcione el XML de la solicitud también. El objetivo aquí es obtener la plantilla XML de solicitud del servicio web en sí. Estoy seguro de que esto es posible de alguna manera porque puedo ver las plantillas XML tanto de solicitud como de respuesta si accedo a la URL de un servicio web en mi navegador.Llamar por programación a webmethods en C#

Este es el código que llama a la WebMethod mediante programación:

XmlDocument doc = new XmlDocument(); 
//this is the problem. I need to get this automatically 
doc.Load("../../request.xml"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld"); 
req.ContentType = "text/xml;charset=\"utf-8\""; 
req.Accept = "text/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); 
Console.WriteLine(r.ReadToEnd()); 
+0

¿cómo se puede llamar a un método (servicio web o de otro tipo) si no se conoce desde el principio qué parámetros requiere? –

+0

Supongamos por ahora que estos métodos web no requieren ningún parámetro. – hancock

+0

¿El servicio web expone una descripción WSDL? – dariom

Respuesta

2

A raíz de los comentarios anteriores. Si tiene un archivo WSDL que describe su servicio, lo utiliza como la información requerida para comunicarse con su servicio web.

El uso de una clase de proxy para comunicarse con su proxy de servicio es una manera fácil de abstraerse de la cañería subyacente de HTTP y XML.

Existen formas de hacerlo en tiempo de ejecución, básicamente generando el código que genera Visual Studio cuando agrega una referencia de servicio web a su proyecto.

He utilizado una solución que se basó en: this newsgroup question, pero también hay other examples out there.

+0

Sí, parece un buen enfoque. Gracias por la respuesta. – hancock

0

FYI, su código falta using bloques. Debería ser más como esto:

XmlDocument doc = new XmlDocument(); 
//this is the problem. I need to get this automatically 
doc.Load("../../request.xml"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld"); 
req.ContentType = "text/xml;charset=\"utf-8\""; 
req.Accept = "text/xml"; 
req.Method = "POST"; 

using (Stream reqstm = req.GetRequestStream()) 
{ 
    doc.Save(reqstm); 
} 

using (WebResponse resp = req.GetResponse()) 
{ 
    using (Stream respstm = resp.GetResponseStream()) 
    { 
     using (StreamReader r = new StreamReader(respstm)) 
     { 
      Console.WriteLine(r.ReadToEnd()); 
     }  
    } 
} 
+0

Tiene razón, pero utilicé la solución de dariom que no emplea esa pieza de código. – hancock