c# . 动态调用webservice的三种方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态调用webservice的三种方式
多数时候我们通过"添加Web引用..."创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。在.NETFramework的System.Web.Services.Description命名空间中有我们需要的东西。
具体步骤:
1.从目标URL下载WSDL数据。
2.使用ServiceDescription创建和格式化WSDL文档文件。
3.使用ServiceDescriptionImporter创建客户端代理类。
4.使用CodeDom动态创建客户端代理类程序集。
5.利用反射调用相关WebService方法。
上述步骤需要引用如下四个名称空间:
using System.Web.Services.Description; //WS的描述
//以下几个用于根据描述动态生成代码并动态编译获取程序集
using System.CodeDom;
using Microsoft.CSharp;
using piler;
上述几个名称空间中包括如下几个重要的类:
using System.Web.Services.Description下:
ServiceDescription //WS描述
ServiceDescriptionImporter //通过描述生成客户端代理类,特别注意其中的Style以下是MSDN对其的描述:
XMLWebservices的接口通常由Web服务描述语言(WSDL)文件来说明。例如,若要获取有关使用http:
//localhost/service.asmx处公开的的Web服务的WSDL说明,只需导航到http:
//localhost/service.asmx?WSDL。使用ServiceDescriptionImporter类可以方便地将WSDL说明中包含的信息导入到System.CodeDom.CodeCompileUnit对象。通过调整Style参数的值,可以指示ServiceDescriptionImporter实例生成客户端代理类(通过透明调用该类可提供Web服务的功能)或生成抽象类(该类封装Web服务的功能而不实现该功能)。如果将Style属性设置为Client,则ServiceDescriptionImporter生成客户端代理类,通过调用这些类来提供说明的Web服务的功能。如果将Style属性设置为Server,则ServiceDescriptionImporter实例生成抽象类,这些类表示所说明的XML Web services的功能而不进行实现。然后,可以通过编写从这些抽象类继承的类来对其进行实现,并实现相关的方法。
using System.CodeDom下:
CodedomUnit//它用于设定动态代码的名称空间,类名等,可以通过ServiceDescriptionImporter.Import()方法将WS的描述代码写入该类,以作动态编译用using piler下:
CodedomProvider//用于创建和检索代码生成器和代码编译器的实例,我们主要用到其实现子类CShareCodeProvider
可以直接用CShareCodeProviderprovider=newCShareCodeProvider()来生成,或者用CodedomProvider.CreateProvider("CSharp")来生成
ICodeCompiler //用于编译基于System.CodeDom的源代码表示形式。
它通过CodedomProvider的CreateCompiler()方法来
CompilerResults //表示从编译器返回的编译结果。它由ICodeCompiler根据指定的编译器设置从指定的CodeCompileUnit所包含的System.CodeDom树中编译程序集并返回。
CompiledAssembly属性指示编译的程序集。
了解如上信息后,就可动态调用WS了。OK,看看具体的例子。
我们要调用的目标WebService,其URL是http: //localhost:60436/Learn.WEB/WebService.asmx HelloWorld.asmx
[WebService(Namespace = "http:
public class WebService :
System.Web.Services.WebService {
public WebService () {}[WebMethod]
public string HelloWorld(){return "Hello Wolrd!";}} 1.动态调用WebService
客户端动态调用代码
using System.IO;
using ;
using System.Reflection;
using System.CodeDom;
using piler;
using System.Web.Services;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
//
1.使用WebClient下载WSDL信息。
WebClient web = new WebClient();
Stream stream = web.OpenRead("http:
//localhost:60436/Learn.WEB/WebService.asmx?WSDL");//
2.创建和格式化WSDL文档。
ServiceDescription description = ServiceDescription.Read(stream);
//
3.创建客户端代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "Soap"; //指定访问协议。
importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。
importer.CodeGenerationOptions
importer.AddServiceDescription(description, null, null); //添加WSDL文档。
//
4.使用CodeDom编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace(); //为代理类添加命名空间,缺省为全局空间。
CodeCompileUnit unit = new CodeCompileUnit();
spaces.Add(nmspace);