C# 动态编译及调用WebService的方法
![]() ![]() 我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。这样方式使用简单,若有一天Web服务方法名或参数改变了,我们需要重新让VS.NET生成代理,并重新编译,在某些情况下,这可能是不能忍受的,我们需要动态调用 WebService的能力。比如我们可以把Web服务的URL保存在配置文件中,这样,当服务URL改变时,只需要修改配置文件就可以了。 WebServiceHelper类: C# Code: using System; using System.Web.Services.Description; using System.IO; using System.Net; using System.Text; using System.CodeDom; using System.CodeDom.Compiler; using Microsoft.CSharp; /// <summary> /// WebServiceHelper 的摘要说明 /// </summary> public class WebServiceHelper { private WebServiceHelper() { } //动态调用web服务 public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } public static object InvokeWebService(string url, string classname, string methodname, object[] args) { string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling"; if ((classname == null) || (classname == "")) { classname = WebServiceHelper.GetWsClassName(url); } try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url "?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler(); //设定编译参数 CompilerParameters cplist = new 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"); //编译代理类 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)); } } private static string GetWsClassName(string wsUrl) { string[] parts = wsUrl.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0]; } } //来源:C/S框架网(www.csframework.com) QQ:1980854898 程序调用过程: C# Code: using System; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; public partial class Test3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string[] args = new string[1]; args[0] = "202.102.224.68"; object obj = WebServiceHelper.InvokeWebService( "http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx", "getCountryCityByIp", args); Response.Write(((string[])(obj))[1]); } } //来源:C/S框架网(www.csframework.com) QQ:1980854898 原文:http://blog.csdn.net/fhbcn/archive/2008/11/18/3326306.aspx ![]() 扫一扫加微信 ![]() ![]()
参考文档:
C#调用Delphi编译的DLL函数库返回大文本数据 Delphi程序调用C#.Net编译的DLL并打开窗体(详解) C#调用C++编译的DLL详解 C# WebService异步处理/异步调用详解 C#.Net 类的同名方法重载调用顺序 C#.Net 调用Delphi 编译的ActiveX COM组件(原) C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) C# GridView 资料行数据检查使用的方法(ValidateRow与InvalidRowException) C# 几个常用获取当前文件名的方法 C#.NET扩展的动态对象支持动态属性和方法以及Json格式与对象互转 C#.NET 定义动态对象dynamic以及属性和方法 通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值 C#.NET通过CodeDom.Compiler动态编译计算表达式的值 C#类扩展方法,字符串对象转换,常用扩展方法StringExtensions C#构造函数(构造方法)
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |