Web服务没有添加引用?

时间:2012-02-28 13:28:31

标签: c# asp.net .net wcf web-services

我有3个Web服务添加到类库中的服务引用。(这是一个API使用的示例项目)我需要将它们移动到我的项目但我无法添加服务引用由于安全问题(安全问题,我的意思是服务只响应一个IP地址,这是我们客户服务器的IP地址。)有没有办法为该particaluar web生成类似于使用“Ildasm.exe”的类服务?

6 个答案:

答案 0 :(得分:36)

您可以使用此课程。我不记得我在哪里找到了基本代码,我之前添加了一些方法并转换为类。

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

答案 1 :(得分:11)

您无需添加Web服务引用即可播放Web服务代码:您可以手动生成要播放的类,例如:

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

然后您可以手动将此文件添加到项目中。

答案 2 :(得分:2)

您可以动态更改服务引用的网址:

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

答案 3 :(得分:2)

这是一个如何调用&#34; GET&#34;来自C#代码的Web服务:

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&#34; DeserializeObject&#34;函数将字符串转换为有用的东西:

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

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

希望这有帮助。

答案 4 :(得分:0)

是的,如果您不想添加引用wsdl.exe /out:d:/Proxy.cs /order将是替代

答案 5 :(得分:0)

如果将wcf服务与json一起使用,则可以实现我在我的一个项目中使用的示例发布方法。您需要newtonsoft json包;

    public static ResponseCL PostPurchOrder(PurchaseOrder order)
    {
        ResponseCL res = new ResponseCL();
        string methodUrl = $"{_main.ws_url}/AddPurchaseOrder";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(methodUrl);
        httpWebRequest.ContentType = "application/json;";
        //if use basic auth//
        //string username = "user";
        //string password = "1234";
        //string encoded = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password));
        //httpWebRequest.Headers.Add("Authorization", "Basic " + encoded);
        httpWebRequest.Method = "POST";
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(JsonConvert.SerializeObject(order));
            streamWriter.Flush();
        }

        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
            res = JsonConvert.DeserializeObject<ResponseCL>(result);
        }
        return res;
    }

使用Microsoft.AspNet.WebApi.Client软件包的另一种方式;

    public static ResponseCL PostPurchOrder2(PurchaseOrder order)
    {
        ResponseCL res = new ResponseCL();
        using (var client = new HttpClient())
        {
            string methodUrl = $"{_main.ws_url}/AddPurchaseOrder";
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var response = client.PostAsJsonAsync(methodUrl, order);
            response.Wait();
            if (response.Result.IsSuccessStatusCode)
            {
                string responseString = response.Result.Content.ReadAsStringAsync().Result;
                res = JsonConvert.DeserializeObject<ResponseCL>(responseString);
            }
        }
        return res;
    }