1

My code is this:

internal class WsProxy
{

    [SecurityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
    internal static object CallWebService(string webServiceAsmxUrl, string userName, string password, string serviceName, string methodName, object[] args) 
    {

        System.Net.WebClient client = new System.Net.WebClient();
        if (userName.Length > 0)
        {
            client.Credentials = new NetworkCredential(userName, password);
        } 
        // 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 = "Soap"; // 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("nmspace");//nmspace

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

            return mi.Invoke(wsvcClass, args);

        }

        else
        {

            return null;

        }

    }

And here is how I call it:

object[] arg = new object[5];
WsProxy.CallWebService(@"myurl/somename.asmx", "NameService", "TheMethod", arg); 

But every time, wsvcClass is null.

I tried changing

object wsvcClass = results.CompiledAssembly.CreateInstance("nmspace");

to

object wsvcClass = results.CompiledAssembly.CreateInstance("nmspace."+serviceName);

and it doesn't work.

Everyone says that the code works like charm, but I can't get it to work. Why?

UPDATE: Here is what I do when I add the reference dynamically:

Namespace.MyService defect = new Namespace.MyService();
defect.Name = "someName";

And here is how I try to do it via code:

object wsvcClass = results.CompiledAssembly.CreateInstance("Namespace." + "MyService");
MethodInfo mi = wsvcClass.GetType().GetMethod("Namespace." + "MyService");
return mi.Invoke(null, new object[] { "someName" });

mi is null and I know there's something wrong on the last line too. It just looks stupid to me.

5
  • When you say "can't get it to work", what happens that you don't expect / doesn't happen that should? Commented Jan 20, 2012 at 14:26
  • @CJBrew Well wsvcClass is always null, and it shouldn't be. After that, when creating the MethodInfo objects, there is a null exception. Commented Jan 20, 2012 at 14:27
  • Have you tried stepping through the WsProxy.CallWebService method to see why it is returning null? Are you sure it is even getting to the point it could create the instance? Commented Jan 20, 2012 at 14:31
  • 1
    As far as I remember CreateInstance requires the full namespace and type name... What is "nmspace"? Commented Jan 20, 2012 at 14:34
  • @CJBrew And once I create instance, how do I assign the properties? wsvcClass doesn't have name as property, but the service has. Commented Jan 20, 2012 at 14:54

1 Answer 1

1

have you tried

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

"nmspace" is wrong as this is the name of your variable, which holds a CodeNamespace with no name.

Sign up to request clarification or add additional context in comments.

4 Comments

And once I create instance, how do I assign the properties? wsvcClass doesn't have name as property, but the service has.
You just need to make sure that serviceName is the name of your .asmx file and the code works (somename in your example). You do not need to set any properties, just invoke the method passing the parameters.
Here is how I use the reference added by hand: DefectsService.Defect defect = new DefectsService.Defect(); defect.Name = "someName"; There isn't a method passing the parameters.
Well your question is about dynamically calling a web service and that's what the code does when you execute the method passing the parameters with mi.Invoke(wsvcClass, args);. Why do you need to set the Name property? Is Defect an object that you are passing to the service method? Can you edit the question (or add a new one) and post the code you would like to use?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.