2012-02-28 22 views
6

Ben. 3 web hizmetleri bir sınıf kitaplığı hizmet referanslarına eklenen (Bu, bir API kullanımı için örnek bir projedir) Ben Projemi içine bu hareket etmek gerekir ama (çünkü güvenlik sorunlarının servis başvuruları ekleyemezsiniz Güvenlik sorunları ile hizmet sadece bir ip adresine cevap veriyor ve bu da müşterimizin sunucusunun ip adresi anlamına geliyor.) Bu particaluar web hizmeti için "Ildasm.exe" kullanarak bir sınıf oluşturmanın bir yolu var mı?Web Servisi bir referans eklemeden mi?

+0

Hizmet yalnızca belirli IP adreslerine yanıt veriyorsa, kodunuzu nasıl test etmeyi planlıyorsunuz? Benim önerim, servisin WSDL'sini elinde bulundurmak ve bununla etkileşime geçmek için sınıfları oluşturmak için svcutil'i çalıştırmanız gerekir. – Rich

cevap

8

Sen web hizmeti koduyla oynamak için web hizmeti başvuru eklemek gerekmez:

wsdl.exe /out:d:/Proxy.cs/düzen: Manuel olarak örneğin oynamak için sınıf oluşturabilir http://localhost:2178/Services.asmx

Ve sonra projenize elle dosyayı ekleyebilirsiniz.

+1

Beni dövün :) Referans amaçlı -> http://msdn.microsoft.com/en-us/library/ms155134.aspx – SeanCocteau

+0

Svcutil.exe dosyasına bakmanızı öneririz –

32

Bu sınıfı kullanabilirsiniz. Temel kodu nerede bulduğumu hatırlamadım, bazı yöntemleri ekledim ve daha önce sınıfa geçtim.

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

Ve bu

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

Bunu kullanmak için web API yöntemini çağırmak mümkün mü? Yöntemini çağırmak? – altandogan

+0

Lütfen düşüncelerinizi http://stackoverflow.com/questions/40394297/consume-web-service-dynamically-using-httpwebrequest-without-service-reference adresinde paylaşın –

0

gibi kullanabilirsiniz Evet alternatif

2

dinamik bir şekilde hizmet referans url değiştirebilir olacağını referansı wsdl.exe /out:d:/Proxy.cs /order ekle istemiyorsanız:

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

C# kodunuzdan "GET" web servisini nasıl arayacağınıza dair bir örnek :

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

Sadece bir URL iletin ve yanıtı içeren bir dize döndürür. Oradan, kullanışlı bir şey haline dize açmak için Json.NET "DeserializeObject" işlevini çağırabilirsiniz: Bu yardımcı olur

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

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

Umut.

İlgili konular