C#不添加引用,动态调用webservice .

本文介绍了一种不通过添加引用即可调用WebService的方法。通过使用System.Web.Services.Description库中的工具,实现了灵活调用服务端任意方法的功能,适用于需要频繁更新服务端接口的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://blog.youkuaiyun.com/haukwong/article/details/7023039

好像很多人做WebService的时候都是直接添加引用的方式,然后调用服务端的方法。这样就个问题,就是每次我服务端添加了方法或者修改了方法后都要更新Web引用,这样比较麻烦。下面给一个不用添加引用的方式调用服务端的方法.只是一个简单的测试,不是很规范,用得着的人可以自己封装一下,然后直接传服务端的方法名进去,Type.GetMethod获取方法,然后method.Invoke返回结果。

高手些多多包函,主要是给用得着的人参考一下,互相学习.代码主要是用了 System.Web.Services.Description里的东西


  1. public static object InvokeMethod(string nameSpace, string className, string methodName, object[] param)  
  2. {  
  3.     System.Net.WebClient client = new System.Net.WebClient();  
  4.   
  5.     String url = System.Configuration.ConfigurationManager.ConnectionStrings["serviceAddress"].ConnectionString;//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL   
  6.     System.IO.Stream stream = client.OpenRead(url);  
  7.     System.Web.Services.Description.ServiceDescription description = System.Web.Services.Description.ServiceDescription.Read(stream);  
  8.   
  9.     System.Web.Services.Description.ServiceDescriptionImporter importer = new System.Web.Services.Description.ServiceDescriptionImporter();//创建客户端代理代理类。   
  10.   
  11.     importer.ProtocolName = "Soap"//指定访问协议。   
  12.     importer.Style = System.Web.Services.Description.ServiceDescriptionImportStyle.Client; //生成客户端代理。   
  13.     importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;  
  14.   
  15.     importer.AddServiceDescription(description, nullnull); //添加WSDL文档。   
  16.   
  17.     System.CodeDom.CodeNamespace nmspace = new System.CodeDom.CodeNamespace(); //命名空间   
  18.     nmspace.Name = nameSpace;  
  19.     System.CodeDom.CodeCompileUnit unit = new System.CodeDom.CodeCompileUnit();  
  20.     unit.Namespaces.Add(nmspace);  
  21.   
  22.     System.Web.Services.Description.ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);  
  23.     System.CodeDom.Compiler.CodeDomProvider provider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");  
  24.   
  25.     System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();  
  26.     parameter.GenerateExecutable = false;  
  27.     parameter.OutputAssembly = "TempClass.dll";//输出程序集的名称   
  28.     parameter.ReferencedAssemblies.Add("System.dll");  
  29.     parameter.ReferencedAssemblies.Add("System.XML.dll");  
  30.     parameter.ReferencedAssemblies.Add("System.Web.Services.dll");  
  31.     parameter.ReferencedAssemblies.Add("System.Data.dll");  
  32.   
  33.     System.CodeDom.Compiler.CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);  
  34.     if (result.Errors.HasErrors)  
  35.     {  
  36.         // 显示编译错误信息   
  37.     }  
  38.   
  39.     System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("TempClass.dll");//加载前面生成的程序集   
  40.     Type t = asm.GetType(nameSpace + "." + className);  
  41.   
  42.     object o = Activator.CreateInstance(t);  
  43.     System.Reflection.MethodInfo method = t.GetMethod(methodName);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下   
  44.     object item = method.Invoke(o, param);  
  45.     //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了   
  46.     return item;  
  47. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值