zoukankan      html  css  js  c++  java
  • C#动态调用webservice方法

    摘 自: http://www.hao5191.cn/a/chengxukaifa/c_/20130109/115819.html

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Net; 
    using System.IO; 
    using System.CodeDom.Compiler; 
    using System.Reflection; 
    using System.Web.Services.Description; 
    using System.Xml.Serialization; 
    using System.CodeDom; 
     
    namespace CN100.Member.Utility 
    { 
        public class WebServiceHelper 
        { 
            private static WebServiceHelper webService = null; 
     
            public static WebServiceHelper Instance(string webServiceUrl, string NamSpace) 
            { 
                if (webService == null) 
                { 
                    webService = new WebServiceHelper(webServiceUrl, NamSpace); 
                } 
                return webService; 
            } 
     
            private WebServiceHelper() 
            {  
             
            } 
     
            /// <summary> 
            /// webService地址 
            /// </summary> 
            public string ServerUrl 
            { 
                get; 
                set; 
            } 
     
            /// <summary> 
            /// 调用类命名空间 
            /// </summary> 
            public string NameSpace 
            { 
                get; 
                set; 
            } 
     
            private WebServiceHelper(string webServiceUrl, string namSpace) 
            { 
                ServerUrl = webServiceUrl; 
                NameSpace = namSpace; 
            } 
     
            /// <summary> 
            /// 生成动态引用DLL 
            /// </summary> 
            /// <returns></returns> 
            public bool GenerateWebService() 
            { 
                WebClient client = new WebClient(); 
                String url = ServerUrl + "?WSDL";//这个地址可以写在Config文件里面,,这里取出来就行了.在原地址后面加上: ?WSDL 
                Stream stream = client.OpenRead(url); 
                ServiceDescription description = ServiceDescription.Read(stream); 
                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。 
                importer.ProtocolName = "Soap"; //指定访问协议。 
                importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。 
                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 
                importer.AddServiceDescription(description, null, null); //添加WSDL文档。 
                CodeNamespace nmspace = new CodeNamespace(); //命名空间 
                nmspace.Name = NameSpace; 
                CodeCompileUnit unit = new CodeCompileUnit(); 
                unit.Namespaces.Add(nmspace); 
     
                ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); 
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
     
                CompilerParameters parameter = new CompilerParameters(); 
                parameter.GenerateExecutable = false; 
                parameter.OutputAssembly = NameSpace + ".dll";//输出程序集的名称 
                parameter.ReferencedAssemblies.Add("System.dll"); 
                parameter.ReferencedAssemblies.Add("System.XML.dll"); 
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); 
                parameter.ReferencedAssemblies.Add("System.Data.dll"); 
     
                CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); 
                if (result.Errors.HasErrors) 
                { 
                    // 显示编译错误信息 
                    return false; 
                } 
                return true; 
            } 
     
            private Assembly LoadAssembly(string nameSpace) 
            { 
                Assembly asm = null; 
                try 
                { 
                    asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 
                } 
                catch (FileNotFoundException ex) 
                { 
                    if (GenerateWebService()) 
                    { 
                        asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 
                    } 
                } 
                catch (Exception e) 
                { 
                    throw e; 
                } 
                return asm; 
            } 
     
            /// <summary> 
            /// 执行无返回值方法 
            /// </summary> 
            /// <param name="methodName"></param> 
            /// <param name="nameSpace"></param> 
            /// <param name="args"></param> 
            public void ExcuteMethod(string methodName,string nameSpace,params object[] args) 
            { 
                Assembly asm = LoadAssembly(nameSpace); 
                Type t = asm.GetType(nameSpace); 
                object o = Activator.CreateInstance(t); 
                MethodInfo method = t.GetMethod(methodName); 
                method.Invoke(o, args); 
            } 
     
            public void ExcuteMethod(string methodName,params object[] args) 
            { 
                string nameSpace = NameSpace; 
                ExcuteMethod(methodName, nameSpace, args); 
            } 
     
            /// <summary> 
            /// 执行带返回值方法 
            /// </summary> 
            /// <typeparam name="T"></typeparam> 
            /// <param name="methodName"></param> 
            /// <param name="nameSpace"></param> 
            /// <param name="args"></param> 
            /// <returns></returns> 
            public T ExcuteMethod<T>(string methodName, string nameSpace,params object[] args) 
            { 
                Assembly asm = LoadAssembly(nameSpace); 
                Type t = asm.GetType(nameSpace); 
                object o = Activator.CreateInstance(t); 
                MethodInfo method = t.GetMethod(methodName); 
                T result = (T)method.Invoke(o, args); 
                return result; 
            } 
     
            public T ExcuteMethod<T>(string methodName,params object[] args) 
            { 
                string nameSpace=NameSpace; 
                return ExcuteMethod<T>(methodName, nameSpace, args); 
            } 
     
        } 
    } 
  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/wuyifu/p/3297938.html
Copyright © 2011-2022 走看看