




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多数时候我们通过 添加 Web 引用. 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。在 .NET Framework 的 System.Web.Services.Description 命名空间中有我们需要的东西。具体步骤:1. 从目标 URL 下载 WSDL 数据。2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。3. 使用 ServiceDescriptionImporter 创建客户端代理类。4. 使用 CodeDom 动态创建客户端代理类程序集。5. 利用反射调用相关 WebService 方法。/SummarydescriptionforService1/WebService(Namespace=/)WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)ToolboxItem(false)publicclassProcessFlow:System.Web.Services.WebServiceWebMethodpublicstringHelloWorld()returnHelloWorld;1. 动态调用 WebService客户端动态调用代码usingSystem.IO;usingSystem.Net;usingSystem.Reflection;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Web.Services;usingSystem.Web.Services.Description;usingSystem.Web.Services.Protocols;usingSystem.Xml.Serialization;/1.使用WebClient下载WSDL信息。WebClientweb=newWebClient();Streamstream=web.OpenRead(http:/localhost/FlowEngine/ProcessFlow.asmx?WSDL);/2.创建和格式化WSDL文档。ServiceDescriptiondescription=ServiceDescription.Read(stream);/3.创建客户端代理代理类。ServiceDescriptionImporterimporter=newServiceDescriptionImporter();importer.ProtocolName=Soap;/指定访问协议。importer.Style=ServiceDescriptionImportStyle.Client;/生成客户端代理。importer.CodeGenerationOptions=CodeGenerationOptions.GenerateProperties|CodeGenerationOptions.GenerateNewAsync;importer.AddServiceDescription(description,null,null);/添加WSDL文档。/4.使用CodeDom编译客户端代理类。CodeNamespacenmspace=newCodeNamespace();/为代理类添加命名空间,缺省为全局空间。CodeCompileUnitunit=newCodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarningswarning=importer.Import(nmspace,unit);CodeDomProviderprovider=CodeDomProvider.CreateProvider(CSharp);CompilerParametersparameter=newCompilerParameters();parameter.GenerateExecutable=false;parameter.GenerateInMemory=true;parameter.ReferencedAssemblies.Add(System.dll);parameter.ReferencedAssemblies.Add(System.XML.dll);parameter.ReferencedAssemblies.Add(System.Web.Services.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(ProcessFlowController);/如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。objecto=Activator.CreateInstance(t);MethodInfomethod=t.GetMethod(HelloWorld);Console.WriteLine(method.Invoke(o,null);2. 生成客户端代理程序集文件上面的代码通过在内存中创建动态程序集的方式完成了动态调用过程。如果我们希望将客户端代理类生成程序集文件保存到硬盘,则可以进行如下修改。生成程序集文件后,我们可以通过 Assembly.LoadFrom() 载入并进行反射调用。对于需要多次调用的系统,要比每次生成动态程序集效率高出很多。CodeusingSystem.IO;usingSystem.Net;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Web.Services;usingSystem.Web.Services.Description;usingSystem.Web.Services.Protocols;usingSystem.Xml.Serialization;/1.使用WebClient下载WSDL信息。WebClientweb=newWebClient();Streamstream=web.OpenRead(http:/localhost/FlowEngine/ProcessFlow.asmx?WSDL);/2.创建和格式化WSDL文档。ServiceDescriptiondescription=ServiceDescription.Read(stream);/3.创建客户端代理代理类。ServiceDescriptionImporterimporter=newServiceDescriptionImporter();importer.ProtocolName=Soap;/指定访问协议。importer.Style=ServiceDescriptionImportStyle.Client;/生成客户端代理。importer.CodeGenerationOptions=CodeGenerationOptions.GenerateProperties|CodeGenerationOptions.GenerateNewAsync;importer.AddServiceDescription(description,null,null);/添加WSDL文档。/4.使用CodeDom编译客户端代理类。CodeNamespacenmspace=newCodeNamespace();/为代理类添加命名空间,缺省为全局空间。CodeCompileUnitunit=newCodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarningswarning=importer.Import(nmspace,unit);CodeDomProviderprovider=CodeDomProvider.CreateProvider(CSharp);CompilerParametersparameter=newCompilerParameters();parameter.GenerateExecutable=false;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);CompilerResultsresult=provider.CompileAssemblyFromDom(parameter,unit);if(result.Errors.HasErrors)/显示编译错误信息调用程序集文件演示Assemblyasm=Assembly.LoadFrom(test.dll);Typet=asm.GetType(WProcessFlowController);objecto=Activator.CreateInstance(t);MethodInfomethod=t.GetMethod(HelloWorld);Console.WriteLine(method.Invoke(o,null);3. 获取客户端代理类源代码还有一种情形,就是我们需要获得客户端代理类的 C# 源代码。CodeusingSystem.IO;usingSystem.Net;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Web.Services;usingSystem.Web.Services.Description;usingSystem.Web.Services.Protocols;usingSystem.Xml.Serialization;/1.使用WebClient下载WSDL信息。WebClientweb=newWebClient();Streamstream=web.OpenRead(http:/localhost/FlowEngine/ProcessFlow.asmx?wsdl);/2.创建和格式化WSDL文档。ServiceDescriptiondescription=ServiceDescription.Read(stream);/3.创建客户端代理代理类。ServiceDescriptionImporterimporter=newServiceDescriptionImporter();importer.ProtocolName=Soap;/指定访问协议。importer.Style=ServiceDescriptionImportStyle.Client;/生成客户端代理。importer.CodeGenerationOptions=CodeGenerationOptions.GenerateProperties|CodeGenerationOptions.GenerateNewAsync;importer.AddServiceDescription(description,null,null);/添加WSDL文档。/4.使用CodeDom编译客户端代理类。CodeNamespacenmspace=newCodeNamespace();/为代理类添加命名空间,缺省为全局空间。CodeCompileUnitunit=newCodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarningswarning=importer.Import(nmspace,unit);CodeDomProviderprovider=CodeDomProvider.CreateProvider(CSharp);/5.保存源代码到文件。当然,你也可以直接保存到内存字符串中。TextWriterwriter=File.CreateText(test.cs);/指定你所需的源代码文件名。provider.GenerateCodeFromCompileUnit(unit,writer,null);writer.Flush();writer.Close();如果你调用时触发WebException:请求因HTTP状态415失败:UnsupportedMediaType。这样的异常,赶紧把服务器端的WSE关掉吧。在必须使用WSE的情况下,需要对客户端进行调整,至于代码需要你自己去写了。呵呵最后:整理一下第一种情况下的一个方法:Code/根据指定的信息,调用远程WebService方法/WebService的http形式的地址/欲调用的WebService的命名空间/欲调用的WebService的类名(不包括命名空间前缀)/欲调用的WebService的方法名/参数列表/WebService的执行结果/如果调用失败,将会抛出Exception。请调用的时候,适当截获异常。/异常信息可能会发生在两个地方:/1、动态构造WebService的时候,CompileAssembly失败。/2、WebService本身执行失败。/objectobj=InvokeWebservice(http:/localhost/GSP_WorkflowWebservice/common.asmx,/Genersoft.Platform.Service.Workflow,/Common,/GetToolType,/newobject1);/publicstaticobjectInvokeWebservice(stringurl,stringnamespace,stringclassname,stringmethodname,objectargs)trySystem.Net.WebClientwc=newSystem.Net.WebClient();System.IO.Streamstream=wc.OpenRead(url+?WSDL);System.Web.Services.Description.ServiceDescriptionsd=System.Web.Services.Description.ServiceDescription.Read(stream);System.Web.Services.Description.ServiceDescriptionImportersdi=newSystem.Web.Services.Description.ServiceDescriptionImporter();sdi.AddServiceDescription(sd,);System.CodeDom.CodeNamespacecn=newSystem.CodeDom.CodeNamespace(namespace);System.CodeDom.CodeCompileUnitccu=newSystem.CodeDom.CodeCompileUnit();ccu.Namespaces.Add(cn);sdi.Import(cn,ccu);Microsoft.CSharp.CSharpCodeProvidercsc=newMicrosoft.CSharp.CSharpCodeProvider();System.CodeDom.Compiler.ICodeCompilericc=csc.CreateCompiler();System.CodeDom.Compiler.CompilerParameterscplist=newSystem.CodeDom.Compiler.CompilerParameters();cplist.GenerateExecutable=false;cplist.GenerateInMemory=true;cplist.ReferencedAssemblies.Add(System.dll);cplist.ReferencedAssemblies.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 综合解析云南省大理市7年级上册期末测试卷难点解析练习题(含答案详解)
- 中考数学总复习《概率初步》综合提升测试卷附答案详解【模拟题】
- 自考专业(建筑工程)练习题必考附答案详解
- 注册公用设备工程师考前冲刺测试卷含答案详解【基础题】
- 重庆资源与环境保护职业学院病理与病理生理期末能力提升B卷题库加答案详解
- 自考专业(人力资源管理)能力提升B卷题库附完整答案详解【各地真题】
- 电竞公司医疗保险管理办法
- 中医执业医师考前冲刺练习含答案详解【培优B卷】
- 交通行业智能化交通信号灯与导航方案
- 助听器验配师考试综合练习及答案详解(必刷)
- 医疗仪器保养、维护、修理记录本
- 高产小麦品种介绍
- 创新方法教程题库题库(449道)
- 建设工程消防验收评定规则
- 山东省临沂市兰山区2022-2023学年小升初数学自主招生备考卷含答案
- 电气设备交接试验方案
- D500-D505 2016年合订本防雷与接地图集
- 北邮社电机拖动与调速技术教学包课后题解
- 学校门卫岗位职责及管理制度
- JJG 1105-2015氨气检测仪
- GB/T 17421.7-2016机床检验通则第7部分:回转轴线的几何精度
评论
0/150
提交评论