C#+.NET+动态调用webservice的三种方式.doc
### C# + .NET + 动态调用WebService的三种方式 #### 背景与概述 在实际的软件开发过程中,特别是在企业级应用中,经常需要与其他系统进行交互,其中一个常见的做法就是通过WebService来进行数据交换和服务调用。通常我们会采用“添加Web引用”的方式来创建客户端代理类以调用远程的WebService服务。但是,在某些特殊的情况下,我们可能需要在运行时动态地调用一个未知的服务。这种场景下就需要采用更加灵活的方式来实现动态调用。 #### 动态调用WebService的基础概念 在.NET Framework中,`System.Web.Services.Description`命名空间提供了处理Web服务描述(WSDL)文档的类和方法。通过这些工具,我们可以动态地创建客户端代理类,并且能够在运行时调用WebService方法。 #### 步骤详解 下面详细介绍如何使用.NET Framework提供的工具实现动态调用WebService: 1. **下载WSDL数据**:首先需要从目标URL下载WebService的WSDL文档。这是因为WSDL文档包含了服务的所有描述信息,比如服务地址、服务端点、消息格式等。 2. **创建和格式化WSDL文档文件**:使用`ServiceDescription`类解析WSDL文档,并将其转换成.NET Framework可以理解的形式。 3. **创建客户端代理类**:使用`ServiceDescriptionImporter`类来生成客户端代理类。这个类可以根据WSDL文档中的信息自动生成客户端所需的代理类代码。 4. **动态创建客户端代理类程序集**:利用`System.CodeDom`命名空间下的工具动态创建客户端代理类的程序集。这一步主要是把上一步生成的代码编译成可以在.NET Framework中执行的程序集。 5. **利用反射调用相关WebService方法**:使用反射机制调用代理类中的方法,从而完成对远程WebService的调用。 #### 使用的关键类及方法 1. **`ServiceDescription`**:这个类负责解析WSDL文档,并提供一种.NET友好的表示形式。 2. **`ServiceDescriptionImporter`**:根据`ServiceDescription`提供的信息,可以生成客户端代理类。特别需要注意的是`Style`属性,它可以设置为`Client`或`Server`。如果设置为`Client`,则会生成客户端代理类;如果设置为`Server`,则会生成抽象类,需要进一步实现才能使用。 3. **`CodeDomUnit`**:用于定义动态代码的命名空间、类名等信息。 4. **`CodeDomProvider`**:创建和检索代码生成器和代码编译器的实例,常用的是`CSharpCodeProvider`。 5. **`ICodeCompiler`**:用于编译基于`System.CodeDom`的源代码表示形式。 6. **`CompilerResults`**:表示从编译器返回的结果,包含编译的程序集等信息。 #### 实例分析 假设我们需要调用的目标WebService的URL为`http://localhost:60436/Learn.WEB/WebService.asmxHelloWorld.asmx`,接下来的步骤将是按照上述流程进行操作: 1. **下载WSDL**:通过HTTP请求获取该WebService的WSDL文档。 2. **创建服务描述**:使用`ServiceDescription`解析WSDL文档。 3. **导入服务描述**:利用`ServiceDescriptionImporter`根据服务描述生成客户端代理类。 4. **动态编译**:使用`CSharpCodeProvider`等工具将生成的代码编译成程序集。 5. **调用服务**:通过反射机制找到并调用客户端代理类中的方法。 #### 总结 通过以上步骤,我们可以实现.NET应用程序中动态调用WebService的需求。这种方式相比传统的“添加Web引用”更加灵活,尤其适用于那些服务地址不确定或需要在运行时动态确定服务的情况。此外,这种方式还能够提高程序的扩展性和适应性,使应用程序能够更好地应对不断变化的需求。
- dk12013-05-23很不错,总结的很详细
- 粉丝: 15
- 资源: 54
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助