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

具体步骤:

1. 从目标 URL 下载 WSDL 数据。
2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。
3. 使用 ServiceDescriptionImporter 创建客户端代理类。
4. 使用 CodeDom 动态创建客户端代理类程序集。
5. 利用反射调用相关 WebService 方法。
上述步骤需要引用如下四个名称空间:
using  动态调用 WebService

客户端动态调用代码
using ;
using ;
using ;
using ;
using
using
using
using
using

使用 WebClient 下载 WSDL 信息。
WebClient web = new WebClient();
Stream stream = ("");

创建和格式化 WSDL 文档。
ServiceDescription description = (stream);

创建客户端代理代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

= "Soap"; 使用 CodeDom 编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace(); 使用 Reflection 调用 WebService。
if (!
{
  Assembly asm = ;
  Type t = ("WebService"); 生成客户端代理程序集文件

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

使用 WebClient 下载 WSDL 信息。
WebClient web = new WebClient();
Stream stream = ("");

创建和格式化 WSDL 文档。
ServiceDescription description = (stream);

创建客户端代理代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

= "Soap"; 使用 CodeDom 编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace(); 获取客户端代理类源代码

还有一种情形,就是我们需要获得客户端代理类的 C# 源代码。
using ;
using ;
using ;
using
using
using
using
using

使用 WebClient 下载 WSDL 信息。
WebClient web = new WebClient();
Stream stream = ("");

创建和格式化 WSDL 文档。
ServiceDescription description = (stream);

创建客户端代理代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

= "Soap"; 使用 CodeDom 编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace(); 保存源代码到文件。当然,你也可以直接保存到内存字符串中。
TextWriter writer = (""); // 指定你所需的源代码文件名。
(unit, writer, null);
();
();

如果你调用时触发 "WebException: 请求因 HTTP 状态 415 失败: Unsupported Media Type。" 这样的异常,那么恭喜你和我一样郁闷 ,赶紧把服务器端的 WSE 关掉吧。在必须使用 WSE 的情况下,需要对客户端进行调整,至于代码需要你自己去写了。呵呵~~~~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。