Веб-сервис без добавления ссылки? - PullRequest
6 голосов
/ 28 февраля 2012

У меня есть 3 веб-службы, добавленные к ссылкам на службы в библиотеке классов. (Это пример проекта для использования API) Мне нужно переместить их в мой проект , но я не могу добавить ссылки на службы, потому что проблем безопасности (под проблемами безопасности я подразумеваю, что служба отвечает только на один IP-адрес, и это IP-адрес сервера нашего клиента.) Есть ли способ создать класс, например, используя «Ildasm.exe» для этой частичной веб-службы

Ответы [ 5 ]

36 голосов
/ 28 февраля 2012

Вы можете использовать этот класс. Я не помню, где я нашел основной код, я добавил несколько методов и преобразовал в класс раньше.

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

И вы можете использовать как это

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
11 голосов
/ 28 февраля 2012

Вам не нужно добавлять ссылку на веб-сервис для игры с кодом веб-сервиса: вы можете вручную создать класс для игры, например:

wsdl.exe / out: d: / Proxy.cs / order http://localhost:2178/Services.asmx

А затем вы можете вручную добавить этот файл в ваш проект.

2 голосов
/ 26 сентября 2016

Вот пример того, как вызвать веб-службу «GET» из вашего кода 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;
}

Просто передайте ему URL, и он вернет строку, содержащую ответ.Оттуда вы можете вызвать функцию JSON.Net «DeserializeObject», чтобы превратить строку во что-то полезное:

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

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

Надеюсь, это поможет.

2 голосов
/ 02 июля 2013

Вы можете динамически изменять URL ссылки на услугу:

var service = new MyService.MyWSSoapClient();
service.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://localhost:8080/");
0 голосов
/ 27 июля 2012

Да, если вы не хотите добавлять ссылку wsdl.exe /out:d:/Proxy.cs /order будет альтернативой

...