2012-02-28 269 views
6

Tengo 3 servicios web agregados a las referencias de servicio en una biblioteca de clase. (Este es un proyecto de muestra para uso de API) Necesito moverlos a mi proyecto pero no puedo agregar las referencias de servicio debido a los problemas de seguridad (Por cuestiones de seguridad, me refiero a que el servicio solo responde a una dirección IP y esa es la dirección IP del servidor de nuestro cliente). ¿Hay alguna forma de generar una clase como usar "Ildasm.exe" para ese servicio web particaluar?Servicio web sin agregar una referencia?

+0

Si el servicio solo responde a determinadas direcciones IP, ¿cómo piensa probar su código? Mi sugerencia sería obtener el WSDL del servicio del propietario del mismo y usted debería poder ejecutar svcutil en él para generar las clases para interactuar con él. – Rich

Respuesta

8

No es necesario añadir una referencia de servicio web para jugar con el código de servicio web: Puede generar manualmente clase para jugar con, por ejemplo:

/out:d:/Proxy.cs Wsdl.exe/fin http://localhost:2178/Services.asmx

Y luego puede agregar este archivo manualmente a su proyecto.

+1

Batirme :) Para fines de referencia -> http://msdn.microsoft.com/en-us/library/ms155134.aspx – SeanCocteau

+0

Sugiero buscar en svcutil.exe –

32

Puede usar esta clase. No recuerdo dónde encontré el código básico, agregué algunos métodos y convertí a clase antes.

public class WebService 
{ 
    public string Url { get; set; } 
    public string MethodName { get; set; } 
    public Dictionary<string, string> Params = new Dictionary<string, string>(); 
    public XDocument ResultXML; 
    public string ResultString; 

    public WebService() 
    { 

    } 

    public WebService(string url, string methodName) 
    { 
     Url = url; 
     MethodName = methodName; 
    } 

    /// <summary> 
    /// Invokes service 
    /// </summary> 
    public void Invoke() 
    { 
     Invoke(true); 
    } 

    /// <summary> 
    /// Invokes service 
    /// </summary> 
    /// <param name="encode">Added parameters will encode? (default: true)</param> 
    public void Invoke(bool encode) 
    { 
     string soapStr = 
      @"<?xml version=""1.0"" encoding=""utf-8""?> 
      <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
       xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" 
       xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> 
       <soap:Body> 
       <{0} xmlns=""http://tempuri.org/""> 
        {1} 
       </{0}> 
       </soap:Body> 
      </soap:Envelope>"; 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url); 
     req.Headers.Add("SOAPAction", "\"http://tempuri.org/" + MethodName + "\""); 
     req.ContentType = "text/xml;charset=\"utf-8\""; 
     req.Accept = "text/xml"; 
     req.Method = "POST"; 

     using (Stream stm = req.GetRequestStream()) 
     { 
      string postValues = ""; 
      foreach (var param in Params) 
      { 
       if (encode) 
        postValues += string.Format("<{0}>{1}</{0}>", HttpUtility.UrlEncode(param.Key), HttpUtility.UrlEncode(param.Value)); 
       else 
        postValues += string.Format("<{0}>{1}</{0}>", param.Key, param.Value); 
      } 

      soapStr = string.Format(soapStr, MethodName, postValues); 
      using (StreamWriter stmw = new StreamWriter(stm)) 
      { 
       stmw.Write(soapStr); 
      } 
     } 

     using (StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream())) 
     { 
      string result = responseReader.ReadToEnd(); 
      ResultXML = XDocument.Parse(result); 
      ResultString = result; 
     } 
    } 
} 

Y puede utilizar como esto

WebService ws = new WebService("service_url", "method_name"); 
ws.Params.Add("param1", "value_1"); 
ws.Params.Add("param2", "value_2"); 
ws.Invoke(); 
// you can get result ws.ResultXML or ws.ResultString 
+0

¿Es posible llamar al método web api para usar esto? ¿Invocar método? – altandogan

+0

Comparta sus ideas sobre http://stackoverflow.com/questions/40394297/consume-web-service-dynamically-using-httpwebrequest-without-service-reference –

0

Sí si no desea añadir una referencia wsdl.exe /out:d:/Proxy.cs /order sería la alternativa

2

Usted puede cambiar dinámicamente el URL de una referencia de servicio:

var service = new MyService.MyWSSoapClient(); 
service.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://localhost:8080/"); 
2

Aquí hay un ejemplo de cómo llamar a un servicio web "GET" desde su código C# :

public string CallWebService(string URL) 
{ 
    HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(URL); 
    objRequest.Method = "GET"; 
    objRequest.KeepAlive = false; 

    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); 
    string result = ""; 
    using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) 
    { 
     result = sr.ReadToEnd(); 
     sr.Close(); 
    } 
    return result; 
} 

Simplemente páselo por una URL, y devolverá una cadena que contenga la respuesta. A partir de ahí, se puede llamar a la función "DeserializeObject" JSON.Net para convertir la cadena en algo útil:

string JSONresponse = CallWebService("http://www.inorthwind.com/Service1.svc/getAllCustomers"); 

List<Customer> customers = JsonConvert.DeserializeObject<List<Customer>>(JSONresponse); 

Espero que esto ayude.

Cuestiones relacionadas