10

I am working on XML web services. My client web service "Client" has the url of the wsdl of server web service "Service" at run time. In order for the "Client" to use "Service" i need to do the following thing "programmatically":

1) Get the wsdl file on the fly from "Service" or from a location on the disk. 2) Create a proxy programmatically i.e not using wsdl.exe or Add web reference. 3)Invoke methods on the created proxy.

Is it possible to do it? If some one has done it would be greatful to take any suggestions how to accomplish.

4
  • 1
    It seems like an XY-Problem, You just want to invoke the methods of the webservice, thinking all those steps are needed. Commented Sep 3, 2013 at 20:22
  • I didn't want to have a service reference for each service i am going to communicate.I want to use a single proxy which would create the proxy on the fly from a wsdl ?Is it possible ? Commented Sep 3, 2013 at 20:25
  • 1
    It is very much possible. take a look at this. But this is not creating a proxy instead it creates soap request. Commented Sep 3, 2013 at 20:27
  • 2
    I don't understand the reason for downvote. Commented Sep 3, 2013 at 20:46

1 Answer 1

9

If you want the proxy to be created at runtime checkout this post

https://netmatze.wordpress.com/2012/05/14/building-a-webservice-proxy-at-runtime/

Here is the original answer

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Security.Permissions;
using System.Web.Services.Description;

namespace ConnectionLib
{
    public class WSProxy
    {
        [SecurityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
        public static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
        {
            System.Net.WebClient client = new System.Net.WebClient();

            // Connect To the web service
            System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl");

            // Now read the WSDL file describing a service.
            ServiceDescription description = ServiceDescription.Read(stream);

            ///// LOAD THE DOM /////////

            // Initialize a service description importer.

            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
            importer.ProtocolName = "Soap12"; // Use SOAP 1.2.
            importer.AddServiceDescription(description, null, null);

            // Generate a proxy client.
            importer.Style = ServiceDescriptionImportStyle.Client;

            // Generate properties to represent primitive values.
            importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;

            // Initialize a Code-DOM tree into which we will import the service.
            CodeNamespace nmspace = new CodeNamespace();
            CodeCompileUnit unit1 = new CodeCompileUnit();
            unit1.Namespaces.Add(nmspace);

            // Import the service into the Code-DOM tree. This creates proxy code that uses the service.
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);

            if (warning == 0) // If zero then we are good to go
            {

                // Generate the proxy code
                CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");

                // Compile the assembly proxy with the appropriate references
                string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };

                CompilerParameters parms = new CompilerParameters(assemblyReferences);

                CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);

                // Check For Errors
                if (results.Errors.Count > 0)
                {
                    foreach (CompilerError oops in results.Errors)
                    {
                        System.Diagnostics.Debug.WriteLine("========Compiler error============");
                        System.Diagnostics.Debug.WriteLine(oops.ErrorText);
                    }
                    throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");
                }

                // Finally, Invoke the web service method

                object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);

                MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);

                return mi.Invoke(wsvcClass, args);

            }

            else
            {
                return null;
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

@I4V I have updated the answer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.