首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

C#动态调用webservice步骤

2012-11-23 
C#动态调用webservice方法using Systemusing System.Collections.Genericusing System.Linqusing Syste

C#动态调用webservice方法

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);        }    }}

热点排行