版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态调用webservice的三种方式多数时候我们通过 添加 Web 引用. 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。在 .NET Framework 的 System.Web.Services.Description 命名空间中有我们需要的东西。具体步骤:1. 从目标 URL 下载 WSDL 数据。2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。3. 使用 ServiceDescriptionImporter 创建客户端代理类。4. 使用 CodeDom 动态创建客户端代理类程序集。5
2、. 利用反射调用相关 WebService 方法。上述步骤需要引用如下四个名称空间: using System.Web.Services.Description; /WS的描述/以下几个用于根据描述动态生成代码并动态编译获取程序集using System.CodeDom; using Microsoft.CSharp;using System.CodeDom.Compiler;上述几个名称空间中包括如下几个重要的类:using System.Web.Services.Description下:ServiceDescription /WS描述ServiceDescriptionImporter
3、/通过描述生成客户端代理类,特别注意其中的Style以下是MSDN对其的描述: XML Web services 的接口通常由 Web 服务描述语言 (WSDL) 文件来说明。例如,若要获取有关使用 http:/localhost/service.asmx 处公开的 ASP.NET 的 Web 服务的 WSDL 说明,只需导航到 http:/localhost/service.asmx?WSDL。使用 ServiceDescriptionImporter 类可以方便地将 WSDL 说明中包含的信息导入到 System.CodeDom.CodeCompileUnit 对象。通过调整 Style
4、参数的值,可以指示 ServiceDescriptionImporter 实例生成客户端代理类(通过透明调用该类可提供 Web 服务的功能)或生成抽象类(该类封装 Web 服务的功能而不实现该功能)。如果将 Style 属性设置为 Client,则 ServiceDescriptionImporter 生成客户端代理类,通过调用这些类来提供说明的 Web 服务的功能。如果将 Style 属性设置为 Server,则 ServiceDescriptionImporter 实例生成抽象类,这些类表示所说明的 XML Web services 的功能而不进行实现。然后,可以通过编写从这些抽象类继承的
5、类来对其进行实现,并实现相关的方法。using System.CodeDom下: CodedomUnit /它用于设定动态代码的名称空间,类名等,可以通过ServiceDescriptionImporter.Import()方法将WS的描述代码写入该类,以作动态编译用 using System.CodeDom.Compiler下:CodedomProvider /用于创建和检索代码生成器和代码编译器的实例,我们主要用到其实现子类CShareCodeProvider可以直接用CShareCodeProvider provider=new CShareCodeProvider()来生成,或者用Co
6、dedomProvider.CreateProvider(CSharp)来生成ICodeCompiler /用于编译基于 System.CodeDom 的源代码表示形式。 它通过CodedomProvider的CreateCompiler()方法来CompilerResults /表示从编译器返回的编译结果。 它由ICodeCompiler根据指定的编译器设置从指定的 CodeCompileUnit 所包含的 System.CodeDom 树中编译程序集并返回。CompiledAssembly 属性指示编译的程序集。了解如上信息后,就可动态调用WS了。OK,看看具体的例子。我们要调用的目标 W
7、ebService,其 URL 是 http:/localhost:60436/Learn.WEB/WebService.asmxHelloWorld.asmxWebService(Namespace = /, Description=我的Web服务)WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)public class WebService : System.Web.Services.WebService public WebService () WebMethodpublic
8、string HelloWorld()return Hello Wolrd!;1. 动态调用 WebService客户端动态调用代码using System.IO;using System.Net;using System.Reflection;using System.CodeDom;using System.CodeDom.Compiler;using System.Web.Services;using System.Web.Services.Description;using System.Web.Services.Protocols;using System.Xml.Serializa
9、tion;/ 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 ServiceD
10、escriptionImporter();importer.ProtocolName = Soap; / 指定访问协议。importer.Style = ServiceDescriptionImportStyle.Client; / 生成客户端代理。importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); /
11、添加 WSDL 文档。/ 4. 使用 CodeDom 编译客户端代理类。CodeNamespace nmspace = new CodeNamespace(); / 为代理类添加命名空间,缺省为全局空间。CodeCompileUnit unit = new CodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.Create
12、Provider(CSharp);CompilerParameters parameter = new CompilerParameters();parameter.GenerateExecutable = false;parameter.GenerateInMemory = true;parameter.ReferencedAssemblies.Add(System.dll);parameter.ReferencedAssemblies.Add(System.XML.dll);parameter.ReferencedAssemblies.Add(System.Web.Services.dll
13、);parameter.ReferencedAssemblies.Add(System.Data.dll);CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);/ 5. 使用 Reflection 调用 WebService。if (!result.Errors.HasErrors)Assembly asm = result.CompiledAssembly;Type t = asm.GetType(WebService); / 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。o
14、bject o = Activator.CreateInstance(t);MethodInfo method = t.GetMethod(HelloWorld);Console.WriteLine(method.Invoke(o, null);2. 生成客户端代理程序集文件上面的代码通过在内存中创建动态程序集的方 式完成了动态调用过程。如果我们希望将客户端代理类生成程序集文件保存到硬盘,则可以进行如下修改。生成程序集文件后,我们可以通过 Assembly.LoadFrom() 载入并进行反射调用。对于需要多次调用的系统,要比每次生成动态程序集效率高出很多。using System.IO;us
15、ing System.Net;using System.CodeDom;using System.CodeDom.Compiler;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:/localho
16、st:60436/Learn.WEB/WebService.asmx?WSDL);/ 2. 创建和格式化 WSDL 文档。ServiceDescription description = ServiceDescription.Read(stream);/ 3. 创建客户端代理代理类。ServiceDescriptionImporter importer = new ServiceDescriptionImporter();importer.ProtocolName = Soap; / 指定访问协议。importer.Style = ServiceDescriptionImportStyle.C
17、lient; / 生成客户端代理。importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); / 添加 WSDL 文档。/ 4. 使用 CodeDom 编译客户端代理类。CodeNamespace nmspace = new CodeNamespace(); / 为代理类添加命名空间,缺省为全局空间。CodeCo
18、mpileUnit unit = new CodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.CreateProvider(CSharp);CompilerParameters parameter = new CompilerParameters();parameter.GenerateExecutable = fals
19、e;parameter.OutputAssembly = test.dll; / 可以指定你所需的任何文件名。parameter.ReferencedAssemblies.Add(System.dll);parameter.ReferencedAssemblies.Add(System.XML.dll);parameter.ReferencedAssemblies.Add(System.Web.Services.dll);parameter.ReferencedAssemblies.Add(System.Data.dll);CompilerResults result = provider.C
20、ompileAssemblyFromDom(parameter, unit);if (result.Errors.HasErrors)/ 显示编译错误信息调用程序集文件演示Assembly asm = Assembly.LoadFrom(test.dll);Type t = asm.GetType(WebService); object o = Activator.CreateInstance(t);MethodInfo method = t.GetMethod(HelloWorld);Console.WriteLine(method.Invoke(o, null);3. 获取客户端代理类源代
21、码还有一种情形,就是我们需要获得客户端代理类的 C# 源代码。using System.IO;using System.Net;using System.CodeDom;using System.CodeDom.Compiler;using System.Web.Services;using System.Web.Services.Description;using System.Web.Services.Protocols;using System.Xml.Serialization;/ 1. 使用 WebClient 下载 WSDL 信息。WebClient web = new WebCl
22、ient();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; / 指定访问协议
23、。importer.Style = ServiceDescriptionImportStyle.Client; / 生成客户端代理。importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); / 添加 WSDL 文档。/ 4. 使用 CodeDom 编译客户端代理类。CodeNamespace nmspace = new CodeNamespace(); / 为代理类添加命名空间,缺省为全局空间。CodeCompileUnit unit = new CodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.CreateProvider(CSharp);/ 5. 保存源代码到文件。当然,你也可以直接保存到内存字符串中。Tex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年防止压疮模拟试题(含答案)
- 2026年护理员考试模拟试卷(含答案)
- 护理核心制度及岗位职责理论考试试题答案
- 2026高中数学教资面试历年真题试卷
- 服务等级协议变更同意通知函6篇范文
- 关于2026年代理合同续签条件的商洽函(5篇)范文
- IT行业网络攻防演练操作规范手册
- 零售运营主管电商绩效考核表
- 建筑施工安全防护要素指南
- 娱乐产业明星市场影响与绩效考核表
- 2026年公立医院副院长选拔考试试题及答案
- 2026年天翼云解决方案架构师认证复习题库(附答案)
- 第20课《马克思主义的诞生》(课件)部编版九年级历史上册
- 中医情志护理操作指南
- 2026磁流变抛光材料精密加工领域技术替代可能性报告
- 客户订单台账
- 油罐区(油罐车、油站设备)着火应急处置方案培训课件
- 2025年深圳非高危安全管理员和企业负责人习题有(含答案)
- GJB3206B-2022技术状态管理
- 管壳式换热器
- 【课件】Unit 5 语法精讲:主语从句&it 作形式主语的主语从句 课件人教版(2019)高一选择性必修第一册
评论
0/150
提交评论