




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态调用webservice的三种方式多数时候我们通过"添加Web引用."创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。在.NETFramework的System.Web.Services.Description名空间中有我们需要的东西。具体步骤:1 .从目标URL下载WSDL数据。2 .使用ServiceDescription创建和格式化WSDL文档文件。3 .使用ServiceDescriptionImporter创建客户端代理类。4 .使用CodeDom动态创建客户端代理类程序集。5 .利用反射调用相关
2、WebService方法。上述步骤需要引用如下四个名称空间:usingSystem.Web.Services.Description;/WS勺描述/以下几个用于根据描述动态生成代码并动态编译获取程序集usingSystem.CodeDom;usingMicrosoft.CSharp;usingSystem.CodeDom.Compiler;上述几个名称空间中包括如下几个重要的类:usingSystem.Web.Services.DescriptionF:ServiceDescription/WS描述ServiceDescriptionImporter/通过描述生成客户端代理类,特别注意其中的S
3、tyle以下是MSDN对其的描述:XMLWebservices的接口通常由Web服务描述语言(WSDL良件来说明。例如,若要获取有关使用http:/localhost/service.asmx处公开的ASP.NET勺Web服务的WSDL说明,只需导航到http:localhost/service.asmx?WSDLo使用ServiceDescriptionImporter类可以方便地将WSDL说明中包含的信息导入到System.CodeDom.CodeCompileUni对象。通过调整Style参数的值,可以指示ServiceDescriptionImporter实例生成客户端代理类(通过透明
4、调用该类可提供Web服务的功能)或生成抽象类(该类封装Web服务的功能而不实现该功能)。如果将Style属性设置为Client,则ServiceDescriptionImporter生成客户端代理类,通过调用这些类来提供说明的Web服务的功能。如果将Style属性设置为Server,则ServiceDescriptionImporter实例生成抽象类,这些类表示所说明的XMLWebservices的功能而不进行实现。然后,可以通过编写从这些抽象类继承的类来对其进行实现,并实现相关的方法。usingSystem.CodeDomT:CodedomUnit/它用于设定动态代码的名称空间,类名等,可以
5、通过ServiceDescriptionImporter.Import()方法将WS的描述代码写入该类,以作动态编译用usingSystem.CodeDom.CompilerF:CodedomProvider/用于创建和检索代码生成器和代码编译器的实例,我们主要用到其实现子类CShareCodeProvider可以直接用CShareCodeProviderprovider=newCShareCodeProvide雨生成,或者用CodedomProvider.CreateProvider("CSharp”生成ICodeCompiler用于编译基于System.CodeDom的源代码表示
6、形式。它通过CodedomProvider的CreateCompiler。方法来CompilerResults表示从编译器返回的编译结果。它由ICodeCompiler根据指定的编译器设置从指定的CodeCompileUnit所包含的System.CodeDomW中编译程序集并返回。CompiledAssembly属性指示编译的程序集。了解如上信息后,就可动态调用WS了。OK,看看具体的例子。我们要调用的目标WebService,其URL是http:/localhost:60436/Learn.WEB/WebService.asmxHelloWorld.asmxWebService(Names
7、pace="http:publicclassWebService:System.Web.Services.WebServicepublicWebService()WebMethodpublicstringHelloWorld()return"HelloWolrd!"1.动态调用WebService客户端动态调用代码usingSystem.IO;usingSystem.Net;usingSystem.Reflection;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Web.Services
8、;usingSystem.Web.Services.Description;usingSystem.Web.Services.Protocols;usingSystem.Xml.Serialization;/1 .使用WebClient下载WSDL信息。WebClientweb=newWebClient();Streamstream=web.OpenRead("http:/localhost:60436/Learn.WEB/WebService.asmx?WSDL");/2 .创建和格式化WSDL文档。ServiceDescriptiondescription=Servic
9、eDescription.Read(stream);/3 .创建客户端代理类。ServiceDescriptionImporterimporter=newServiceDescriptionImporter();importer.ProtocolName="Soap"/指定访问协议。importer.Style=ServiceDescriptionImportStyle.Client;/生成客户端代理。importer.CodeGenerationOptionsimporter.AddServiceDescription(description,null,null);添力口
10、WSDL文档。/4 .使用CodeDom编译客户端代理类。CodeNamespacenmspace=newCodeNamespace();为代理类添力口命名空间,缺省为全局空间。CodeCompileUnitunit=newCodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarningswarning=importer.Import(nmspace,unit);CodeDomProviderprovider=CodeDomProvider.CreateProvider("CSharp&quo
11、t;);CompilerParametersparameter=newCompilerParameters();parameter.GenerateExecutable=false;parameter.GenerateInMemory=true;parameter.ReferencedAssemblies.Add("System.dll");parameter.ReferencedAssemblies.Add("System.XML.dll");parameter.ReferencedAssemblies.Add("System.Web.Ser
12、vices.dll");parameter.ReferencedAssemblies.Add("System.Data.dll");CompilerResultsresult=provider.CompileAssemblyFromDom(parameter,unit);/5 .使用Reflection调用WebService。if(!result.Errors.HasErrors)Assemblyasm=result.CompiledAssembly;Typet=asm.GetType("WebService");/如果在前面为代理类添加了命
13、名空/间,此处需要将命名空间添加到类型前面。objecto=Activator.CreateInstance(t);MethodInfomethod=t.GetMethod("HelloWorld");Console.WriteLine(method.Invoke(o,null);=CodeGenerationOptions.GenerateProperties|CodeGenerationOptions.GenerateNewAsync;6 .生成客户端代理程序集文件上面的代码通过在内存中创建动态程序集的方式完成了动态调用过程。如果我们希望将客户端代理类生成程序集文件保存
14、到硬盘,则可以进行如下修改。生成程序集文件后,我们可以通过Assembly.LoadFrom(载入并进行反射调用。对于需要多次调用的系统,要比每次生成动态程序集效率高出很多。usingSystem.IO;usingSystem.Net;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Web.Services;usingSystem.Web.Services.Description;usingSystem.Web.Services.Protocols;usingSystem.Xml.Serialization;/1 .使用
15、WebClient下载WSDL信息。WebClientweb=newWebClient();Streamstream=web.OpenRead("http:/localhost:60436/Learn.WEB/WebService.asmx?WSDL");/2 .创建和格式化WSDL文档。ServiceDescriptiondescription=ServiceDescription.Read(stream);/3 .创建客户端代理类。ServiceDescriptionImporterimporter=newServiceDescriptionImporter();imp
16、orter.ProtocolName="Soap"/指定访问协议。importer.Style=ServiceDescriptionImportStyle.Client;/生成客户端代理。importer.CodeGenerationOptions=CodeGenerationOptions.GeneratePropertiesCodeGenerationOptions.GenerateNewAsync;importer.AddServiceDescription(description,null,null);添力口WSDL文档。/4 .使用CodeDom编译客户端代理类。
17、CodeNamespacenmspace=newCodeNamespace();为代理类添力口命名空间,缺省为全局空间。CodeCompileUnitunit=newCodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarningswarning=importer.Import(nmspace,unit);CodeDomProviderprovider=CodeDomProvider.CreateProvider("CSharp");CompilerParametersparamet
18、er=newCompilerParameters();parameter.GenerateExecutable=false;|parameter.OutputAssembly="test.dll"/可以指定你所需的任何文件名。parameter.ReferencedAssemblies.Add("System.dll");parameter.ReferencedAssemblies.Add("System.XML.dll");parameter.ReferencedAssemblies.Add("System.Web.Ser
19、vices.dll");parameter.ReferencedAssemblies.Add("System.Data.dll");CompilerResultsresult=provider.CompileAssemblyFromDom(parameter,unit);if(result.Errors.HasErrors)显示编译错误信息调用程序集文件演示Assemblyasm=Assembly.LoadFrom("test.dll");Typet=asm.GetType("WebService");objecto=Act
20、ivator.CreateInstance(t);MethodInfomethod=t.GetMethod("HelloWorld");Console.WriteLine(method.Invoke(o,null);3.获取客户端代理类源代码还有一种情形,就是我们需要获得客户端代理类的C#M代码。usingSystem.IO;usingSystem.Net;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Web.Services;usingSystem.Web.Services.Description
21、;usingSystem.Web.Services.Protocols;usingSystem.Xml.Serialization;/1 .使用WebClient下载WSDL信息。WebClientweb=newWebClient();Streamstream=web.OpenRead("http:/localhost:60436/Learn.WEB/WebService.asmx?WSDL");/2 .创建和格式化WSDL文档。ServiceDescriptiondescription=ServiceDescription.Read(stream);/3 .创建客户端代理类。ServiceDescriptionImporterimporter=newServiceDescriptionImporter();importer.ProtocolName="Soap"/指定访问协议。importer.Style=ServiceDescriptionImportStyle.Client;/生成客户端代理。importer.CodeGenerationOptions=CodeGenerationOptions.GeneratePropertie
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国人字型输送网带数据监测研究报告
- 2025至2030年中国中药浸膏型喷雾干燥机数据监测研究报告
- 2025至2030年中国T4/T5老化线数据监测研究报告
- 2025至2030年中国CDMA车载电话数据监测研究报告
- 2025年中国背心马褂工作服市场调查研究报告
- 二零二五年度保险公司股权转让与保险产品研发合同
- 物业保洁年度工作计划
- 学生个人顶岗实习总结
- 2025年度办公用品智能化管理系统承包合同
- 销售合作合同范本
- 七年级历史第5课--安史之乱与唐朝衰亡ppt课件
- 户外LED显示屏设计施工方案.docx
- 上岗证WORD模板
- 净土资粮——信愿行(05)第三讲安住在弥陀大愿之海
- 化工车间开停车风险分析
- 钣金k因子和折弯扣除参照表
- 市政小三线施工方案(共22页)
- 静压桩机、钻孔灌注桩、沉槽机CAD图形
- 易经(拼音版)
- 红旗优质服务窗口先进事迹材料
- 总监办标准化管理规定
评论
0/150
提交评论