Web Service without adding a reference?

I have 3 web services added to service references in a class library.(This is a sample project for an API use) I need to move these into my project but i cannot add the service references because of the security issues(By security issues i mean the service only responds to one ip address and that is the ip address of our customer's server.) Is there a way to generate a class like using "Ildasm.exe" for that particaluar web service?

Answers


You don't need to add web service reference to play with web service code: You can manually generate class to play with e.g.:

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

And then you can add this file manually to your project.


You can use this class. I didn't remember where i found the basic code, i added some methods and convert to class before.

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

And you can use like this

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

You can dynamically change the url of a service reference:

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

Here's an example of how to call a "GET" web service from your C# code:

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

Simply pass it a URL, and it'll return a string containing the response. From there, you can call the JSON.Net "DeserializeObject" function to turn the string into something useful:

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

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

Hope this helps.


Yes if you dont want to Add reference wsdl.exe /out:d:/Proxy.cs /order would be the alternative


Need Your Help

Selecting multiple classes with jQuery

javascript jquery jquery-selectors

I’ve had a good look and can’t seem to find out how to select all elements matching certain classes in one jQuery selector statement such as this:

No C# 6.0 in Visual Studio 2015 CTP?

c# visual-studio visual-studio-2015 roslyn c#-6.0

I have just created a new VM on Azure (using the image provided by the Azure team from the gallery) with CTP version of the upcoming Visual Studio 2014 that appeared yesterday online to test it and