Pages

Wednesday, October 19, 2011

Invoke Webservice Dyanamicly

Hi Friends this time I want to share , How to Invoke Webservice Dyanamicly and get Response
I Created a Class and Create a method to get all the webmethods in the given serivce Url
using System.Net;
using System;
using System.Web.Services.Description;
using System.CodeDom;
using System.IO;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Xml.Serialization;

public class DyanamicProxyGeneration
{
 #region Members
 List _serviceMethods;
 Uri uri;
 String Url;
 WebRequest webRequest;
 Stream requestStream;
 ServiceDescription sd;
 ServiceDescriptionImporter servImport;
 MethodInfo[] methodInfo;        
 CodeCompileUnit codeCompileUnit;
 StringWriter stringWriter;
 CodeNamespace nameSpace;
 Type service;
 CSharpCodeProvider prov;
 Assembly assembly;
 CompilerResults results;
 CompilerParameters param;
 String[] assemblyReferences;                        
 #endregion
 public void DynamicInvocation(string Url)
 {
  try
  {
   uri = new Uri(Url + "?WSDL");
   webRequest = WebRequest.Create(uri);
   requestStream = webRequest.GetResponse().GetResponseStream();
   // Get a WSDL file describing a service
   sd = ServiceDescription.Read(requestStream);
   string sdName = sd.Services[0].Name;

   // Initialize a service description servImport
   servImport = new ServiceDescriptionImporter();
   servImport.AddServiceDescription(sd, String.Empty, String.Empty);
   servImport.ProtocolName = "Soap";
   servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;


   nameSpace = new CodeNamespace();
   codeCompileUnit = new CodeCompileUnit();
   codeCompileUnit.Namespaces.Add(nameSpace);
   // Set Warnings
   ServiceDescriptionImportWarnings warnings = servImport.Import(nameSpace, codeCompileUnit);

   if (warnings == 0)
   {
    stringWriter = new StringWriter(System.Globalization.CultureInfo.CurrentCulture);
    prov = new Microsoft.CSharp.CSharpCodeProvider();
    prov.GenerateCodeFromNamespace(nameSpace, stringWriter, new CodeGeneratorOptions());
    
    // Compile the assembly with the appropriate references
    assemblyReferences = new string[2] { "System.Web.Services.dll", "System.Xml.dll" };
    param = new CompilerParameters(assemblyReferences);
    param.GenerateExecutable = false;
    param.GenerateInMemory = true;
    param.TreatWarningsAsErrors = false;
    param.WarningLevel = 4;
    results = new CompilerResults(new TempFileCollection());
    results = prov.CompileAssemblyFromDom(param, codeCompileUnit);
    assembly = results.CompiledAssembly;
    service = assembly.GetType(sdName);
    methodInfo = service.GetMethods();
    
    foreach (MethodInfo t in methodInfo)
    {
     if (t.Name == "Discover")
      break;
     _serviceMethods.Add(t.Name);
    }
   }
  }
  catch (Exception ex)
  {
  }
 }
}


public object GetResponse(MethodInfo[] methodInfoList)
        {
            Object response = null;
            ParameterInfo [] paramters;

            foreach (MethodInfo t in methodInfo)
            {
                //Invoke Method
                paramters  = new ParameterInfo []{};
                paramters = t.GetParameters();
                object[] param1 = paramters;
                Object obj = Activator.CreateInstance(service);
                response = t.Invoke(obj, param1);
                break;
            }
            if (response != null)
            {
                return response;
            }
            else
                return null;
        }

1 comment: