当前位置:编程学习 > C#/ASP.NET >>

C#动态调用WebServices

一、方法InvokeWebservice

///   <summary>   

    ///   根据指定的信息,调用远程WebService方法   

    ///   </summary>   

    ///   <param   name="url">WebService的http形式的地址</param>   

    ///   <param   name="namespace">欲调用的WebService的命名空间</param>   

    ///   <param   name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>   

    ///   <param   name="methodname">欲调用的WebService的方法名</param>   

    ///   <param   name="args">参数列表</param>   

    ///   <returns>WebService的执行结果</returns>   

    ///   <remarks>   

    ///   如果调用失败,将会抛出Exception。请调用的时候,适当截获异常。   

    ///   异常信息可能会发生在两个地方:   

    ///   1、动态构造WebService的时候,CompileAssembly失败。   

    ///   2、WebService本身执行失败。   

    ///   </remarks>   

    ///   <example>   

    ///   <code>   

    ///   object   obj   =   InvokeWebservice("http://localhost/GSP_WorkflowWebservice/common.asmx","Genersoft.Platform.Service.Workflow","Common","GetToolType",new   object[]{"1"});   

    ///   </code>   

    ///   </example>   

    public static object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args)

    {

        try

        {

            System.Net.WebClient wc = new System.Net.WebClient();

            System.IO.Stream stream = wc.OpenRead(url + "?WSDL");

            System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);

            System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();

            sdi.AddServiceDescription(sd, "", "");

            System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);

            System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();

            ccu.Namespaces.Add(cn);

            sdi.Import(cn, ccu);

            Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();

            System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();

            System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();

            cplist.GenerateExecutable = false;

            cplist.GenerateInMemory = true;

            cplist.ReferencedAssemblies.Add("System.dll");

            cplist.ReferencedAssemblies.Add("System.XML.dll");

            cplist.ReferencedAssemblies.Add("System.Web.Services.dll");

            cplist.ReferencedAssemblies.Add("System.Data.dll");

            System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);

            if (true == cr.Errors.HasErrors)

            {

                System.Text.StringBuilder sb = new System.Text.StringBuilder();

                foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)

                {

                    sb.Append(ce.ToString());

                    sb.Append(System.Environment.NewLine);

                }

                throw new Exception(sb.ToString());

            }

            System.Reflection.Assembly assembly = cr.CompiledAssembly;

            Type t = assembly.GetType(@namespace + "." + classname, true, true);

            object obj = Activator.CreateInstance(t);

            System.Reflection.MethodInfo mi = t.GetMethod(methodname);

            return mi.Invoke(obj, args);

        }

        catch (Exception ex)

        {

            throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));

        }

    }

 

二、调用

            object[] Object = new object[] { "Sun" };//定义object数组 

            object aa = InvokeWebservice("http://192.168.1.200:111", "WebService2", "Service1", "show", Object);

            textBox1.Text = aa.ToString();

    
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,