多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。在 .NET Framework 的 System.Web.Services.Description 命名空间中有我们需要的东西。

具体步骤:

1. 从目标 URL 下载 WSDL 数据。
2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。
3. 使用 ServiceDescriptionImporter 创建客户端代理类。
4. 使用 CodeDom 动态创建客户端代理类程序集。
5. 利用反射调用相关 WebService 方法。

OK,看看具体的例子。

我们要调用的目标 WebService,其 URL 是 http://localhost:60436/Learn.WEB/WebService.asmx

 

 

Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结HelloWorld.asmx [WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
Web Service学习笔记:动态调用WebService的方法总结[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]

 

 

2. 生成客户端代理程序集文件

上面的代码通过在内存中创建动态程序集的方式完成了动态调用过程。如果我们希望将客户端代理类生成程序集文件保存到硬盘,则可以进行如下修改。生成程序集文件后,我们可以通过 Assembly.LoadFrom() 载入并进行反射调用。对于需要多次调用的系统,要比每次生成动态程序集效率高出很多。

 

 

Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结using System.IO;
Web Service学习笔记:动态调用WebService的方法总结
using System.Net;
Web Service学习笔记:动态调用WebService的方法总结
using System.CodeDom;
Web Service学习笔记:动态调用WebService的方法总结
using System.CodeDom.Compiler;
Web Service学习笔记:动态调用WebService的方法总结
using System.Web.Services;
Web Service学习笔记:动态调用WebService的方法总结
using System.Web.Services.Description;
Web Service学习笔记:动态调用WebService的方法总结
using System.Web.Services.Protocols;
Web Service学习笔记:动态调用WebService的方法总结
using System.Xml.Serialization;
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结
// 1. 使用 WebClient 下载 WSDL 信息。
Web Service学习笔记:动态调用WebService的方法总结
WebClient web = new WebClient();
Web Service学习笔记:动态调用WebService的方法总结Stream stream 
= web.OpenRead("http://localhost:60436/Learn.WEB/WebService.asmx?WSDL");
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结
// 2. 创建和格式化 WSDL 文档。
Web Service学习笔记:动态调用WebService的方法总结
ServiceDescription description = ServiceDescription.Read(stream);
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结
// 3. 创建客户端代理代理类。
Web Service学习笔记:动态调用WebService的方法总结
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结importer.ProtocolName 
= "Soap"// 指定访问协议。
Web Service学习笔记:动态调用WebService的方法总结
importer.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。
Web Service学习笔记:动态调用WebService的方法总结
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结importer.AddServiceDescription(description, 
nullnull); // 添加 WSDL 文档。
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结
// 4. 使用 CodeDom 编译客户端代理类。
Web Service学习笔记:动态调用WebService的方法总结
CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间,缺省为全局空间。
Web Service学习笔记:动态调用WebService的方法总结
CodeCompileUnit unit = new CodeCompileUnit();
Web Service学习笔记:动态调用WebService的方法总结unit.Namespaces.Add(nmspace);
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结ServiceDescriptionImportWarnings warning 
= importer.Import(nmspace, unit); 
Web Service学习笔记:动态调用WebService的方法总结CodeDomProvider provider 
= CodeDomProvider.CreateProvider("CSharp");
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结CompilerParameters parameter 
= new CompilerParameters();
Web Service学习笔记:动态调用WebService的方法总结parameter.GenerateExecutable 
= false;
Web Service学习笔记:动态调用WebService的方法总结parameter.OutputAssembly 
= "test.dll"// 可以指定你所需的任何文件名。
Web Service学习笔记:动态调用WebService的方法总结
parameter.ReferencedAssemblies.Add("System.dll");
Web Service学习笔记:动态调用WebService的方法总结parameter.ReferencedAssemblies.Add(
"System.XML.dll");
Web Service学习笔记:动态调用WebService的方法总结parameter.ReferencedAssemblies.Add(
"System.Web.Services.dll");
Web Service学习笔记:动态调用WebService的方法总结parameter.ReferencedAssemblies.Add(
"System.Data.dll");
Web Service学习笔记:动态调用WebService的方法总结
Web Service学习笔记:动态调用WebService的方法总结CompilerResults result 
= provider.CompileAssemblyFromDom(parameter, unit);
Web Service学习笔记:动态调用WebService的方法总结
if (result.Errors.HasErrors)

相关文章:

  • 2021-10-27
  • 2022-12-23
  • 2021-10-06
  • 2022-02-26
  • 2021-08-02
  • 2022-01-08
  • 2021-09-14
  • 2022-02-26
猜你喜欢
  • 2021-11-20
  • 2022-12-23
  • 2021-07-15
  • 2022-12-23
  • 2021-06-02
  • 2021-10-26
相关资源
相似解决方案