版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、動(dòng)態(tài)調(diào)用webservice的三種方式多數(shù)時(shí)候我們通過(guò) 添加 Web 引用. 創(chuàng)建客戶(hù)端代理類(lèi)的方式調(diào)用WebService,但在某些情況下我們可能需要在程序運(yùn)行期間動(dòng)態(tài)調(diào)用一個(gè)未知的服務(wù)。在 .NET Framework 的 System.Web.Services.Description 命名空間中有我們需要的東西。具體步驟:1. 從目標(biāo) URL 下載 WSDL 數(shù)據(jù)。2. 使用 ServiceDescription 創(chuàng)建和格式化 WSDL 文檔文件。3. 使用 ServiceDescriptionImporter 創(chuàng)建客戶(hù)端代理類(lèi)。4. 使用 CodeDom 動(dòng)態(tài)創(chuàng)建客戶(hù)端代理類(lèi)程序集。5
2、. 利用反射調(diào)用相關(guān) WebService 方法。上述步驟需要引用如下四個(gè)名稱(chēng)空間: using System.Web.Services.Description; /WS的描述/以下幾個(gè)用于根據(jù)描述動(dòng)態(tài)生成代碼并動(dòng)態(tài)編譯獲取程序集using System.CodeDom; using Microsoft.CSharp;using System.CodeDom.Compiler;上述幾個(gè)名稱(chēng)空間中包括如下幾個(gè)重要的類(lèi):using System.Web.Services.Description下:ServiceDescription /WS描述ServiceDescriptionImporter
3、/通過(guò)描述生成客戶(hù)端代理類(lèi),特別注意其中的Style以下是MSDN對(duì)其的描述: XML Web services 的接口通常由 Web 服務(wù)描述語(yǔ)言 (WSDL) 文件來(lái)說(shuō)明。例如,若要獲取有關(guān)使用 http:/localhost/service.asmx 處公開(kāi)的 ASP.NET 的 Web 服務(wù)的 WSDL 說(shuō)明,只需導(dǎo)航到 http:/localhost/service.asmx?WSDL。使用 ServiceDescriptionImporter 類(lèi)可以方便地將 WSDL 說(shuō)明中包含的信息導(dǎo)入到 System.CodeDom.CodeCompileUnit 對(duì)象。通過(guò)調(diào)整 Style
4、參數(shù)的值,可以指示 ServiceDescriptionImporter 實(shí)例生成客戶(hù)端代理類(lèi)(通過(guò)透明調(diào)用該類(lèi)可提供 Web 服務(wù)的功能)或生成抽象類(lèi)(該類(lèi)封裝 Web 服務(wù)的功能而不實(shí)現(xiàn)該功能)。如果將 Style 屬性設(shè)置為 Client,則 ServiceDescriptionImporter 生成客戶(hù)端代理類(lèi),通過(guò)調(diào)用這些類(lèi)來(lái)提供說(shuō)明的 Web 服務(wù)的功能。如果將 Style 屬性設(shè)置為 Server,則 ServiceDescriptionImporter 實(shí)例生成抽象類(lèi),這些類(lèi)表示所說(shuō)明的 XML Web services 的功能而不進(jìn)行實(shí)現(xiàn)。然后,可以通過(guò)編寫(xiě)從這些抽象類(lèi)繼承的
5、類(lèi)來(lái)對(duì)其進(jìn)行實(shí)現(xiàn),并實(shí)現(xiàn)相關(guān)的方法。using System.CodeDom下: CodedomUnit /它用于設(shè)定動(dòng)態(tài)代碼的名稱(chēng)空間,類(lèi)名等,可以通過(guò)ServiceDescriptionImporter.Import()方法將WS的描述代碼寫(xiě)入該類(lèi),以作動(dòng)態(tài)編譯用 using System.CodeDom.Compiler下:CodedomProvider /用于創(chuàng)建和檢索代碼生成器和代碼編譯器的實(shí)例,我們主要用到其實(shí)現(xiàn)子類(lèi)CShareCodeProvider可以直接用CShareCodeProvider provider=new CShareCodeProvider()來(lái)生成,或者用Co
6、dedomProvider.CreateProvider(CSharp)來(lái)生成ICodeCompiler /用于編譯基于 System.CodeDom 的源代碼表示形式。 它通過(guò)CodedomProvider的CreateCompiler()方法來(lái)CompilerResults /表示從編譯器返回的編譯結(jié)果。 它由ICodeCompiler根據(jù)指定的編譯器設(shè)置從指定的 CodeCompileUnit 所包含的 System.CodeDom 樹(shù)中編譯程序集并返回。CompiledAssembly 屬性指示編譯的程序集。了解如上信息后,就可動(dòng)態(tài)調(diào)用WS了。OK,看看具體的例子。我們要調(diào)用的目標(biāo) W
7、ebService,其 URL 是 http:/localhost:60436/Learn.WEB/WebService.asmxHelloWorld.asmxWebService(Namespace = /, Description=我的Web服務(wù))WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)public class WebService : System.Web.Services.WebService public WebService () WebMethodpublic
8、string HelloWorld()return Hello Wolrd!;1. 動(dòng)態(tài)調(diào)用 WebService客戶(hù)端動(dòng)態(tài)調(diào)用代碼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. 創(chuàng)建和格式化 WSDL 文檔。ServiceDescription description = ServiceDescription.Read(stream);/ 3. 創(chuàng)建客戶(hù)端代理代理類(lèi)。ServiceDescriptionImporter importer = new ServiceD
10、escriptionImporter();importer.ProtocolName = Soap; / 指定訪(fǎng)問(wèn)協(xié)議。importer.Style = ServiceDescriptionImportStyle.Client; / 生成客戶(hù)端代理。importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); /
11、添加 WSDL 文檔。/ 4. 使用 CodeDom 編譯客戶(hù)端代理類(lèi)。CodeNamespace nmspace = new CodeNamespace(); / 為代理類(lèi)添加命名空間,缺省為全局空間。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 調(diào)用 WebService。if (!result.Errors.HasErrors)Assembly asm = result.CompiledAssembly;Type t = asm.GetType(WebService); / 如果在前面為代理類(lèi)添加了命名空間,此處需要將命名空間添加到類(lèi)型前面。o
14、bject o = Activator.CreateInstance(t);MethodInfo method = t.GetMethod(HelloWorld);Console.WriteLine(method.Invoke(o, null);2. 生成客戶(hù)端代理程序集文件上面的代碼通過(guò)在內(nèi)存中創(chuàng)建動(dòng)態(tài)程序集的方 式完成了動(dòng)態(tài)調(diào)用過(guò)程。如果我們希望將客戶(hù)端代理類(lèi)生成程序集文件保存到硬盤(pán),則可以進(jìn)行如下修改。生成程序集文件后,我們可以通過(guò) Assembly.LoadFrom() 載入并進(jìn)行反射調(diào)用。對(duì)于需要多次調(diào)用的系統(tǒng),要比每次生成動(dòng)態(tài)程序集效率高出很多。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. 創(chuàng)建和格式化 WSDL 文檔。ServiceDescription description = ServiceDescription.Read(stream);/ 3. 創(chuàng)建客戶(hù)端代理代理類(lèi)。ServiceDescriptionImporter importer = new ServiceDescriptionImporter();importer.ProtocolName = Soap; / 指定訪(fǎng)問(wèn)協(xié)議。importer.Style = ServiceDescriptionImportStyle.C
17、lient; / 生成客戶(hù)端代理。importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); / 添加 WSDL 文檔。/ 4. 使用 CodeDom 編譯客戶(hù)端代理類(lèi)。CodeNamespace nmspace = new CodeNamespace(); / 為代理類(lèi)添加命名空間,缺省為全局空間。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)/ 顯示編譯錯(cuò)誤信息調(diào)用程序集文件演示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. 獲取客戶(hù)端代理類(lèi)源代
21、碼還有一種情形,就是我們需要獲得客戶(hù)端代理類(lèi)的 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. 創(chuàng)建和格式化 WSDL 文檔。ServiceDescription description = ServiceDescription.Read(stream);/ 3. 創(chuàng)建客戶(hù)端代理代理類(lèi)。ServiceDescriptionImporter importer = new ServiceDescriptionImporter();importer.ProtocolName = Soap; / 指定訪(fǎng)問(wèn)協(xié)議
23、。importer.Style = ServiceDescriptionImportStyle.Client; / 生成客戶(hù)端代理。importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); / 添加 WSDL 文檔。/ 4. 使用 CodeDom 編譯客戶(hù)端代理類(lèi)。CodeNamespace nmspace = new CodeNamespace(); / 為代理類(lèi)添加命名空間,缺省為全局空間。CodeCompileUnit unit = new CodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.CreateProvider(CSharp);/ 5. 保存源代碼到文件。當(dāng)然,你也可以直接保存到內(nèi)存字符串中。Tex
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年八年級(jí)歷史期末無(wú)與倫比試卷
- 2025浙江溫嶺市城市新區(qū)管委會(huì)下屬?lài)?guó)有企業(yè)招聘編外人員3人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年中職動(dòng)物營(yíng)養(yǎng)管理(管理技術(shù))試題及答案
- 2025年高職水族科學(xué)與技術(shù)(水族養(yǎng)殖)試題及答案
- 2025年中職大數(shù)據(jù)錄入(數(shù)據(jù)規(guī)范錄入)試題及答案
- 2025年大學(xué)藝術(shù)設(shè)計(jì)學(xué)(設(shè)計(jì)理論基礎(chǔ))試題及答案
- 2025年高職消防安全工程技術(shù)(消防方案)模擬試題
- 2025年大學(xué)生命科學(xué)(生態(tài)學(xué))試題及答案
- 2025年大學(xué)大三(法學(xué))合同法基礎(chǔ)試題及答案
- 2025年大學(xué)護(hù)理學(xué)(護(hù)理技術(shù)研發(fā))試題及答案
- 君山島年度營(yíng)銷(xiāo)規(guī)劃
- 10月住院醫(yī)師規(guī)范化培訓(xùn)《泌尿外科》測(cè)試題(含參考答案解析)
- 2025年山東師范大學(xué)馬克思主義基本原理概論期末考試參考題庫(kù)
- 期末測(cè)試卷(試卷)2025-2026學(xué)年三年級(jí)數(shù)學(xué)上冊(cè)(人教版)
- 2025年福建江夏學(xué)院毛澤東思想和中國(guó)特色社會(huì)主義理論體系概論期末考試模擬題及答案1套
- DB32T 5132.3-2025 重點(diǎn)人群職業(yè)健康保護(hù)行動(dòng)指南 第3部分:醫(yī)療衛(wèi)生人員
- 2025秋中國(guó)南水北調(diào)集團(tuán)新能源投資有限公司校園招聘(25人)(公共基礎(chǔ)知識(shí))測(cè)試題帶答案解析
- 2025至2030中國(guó)X射線(xiàn)衍射儀(XRD)行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 核電廠(chǎng)抗震設(shè)計(jì)標(biāo)準(zhǔn)
- 2026年經(jīng)銷(xiāo)商合同
- 2023-2025年中考英語(yǔ)真題匯編01之單項(xiàng)選擇(時(shí)態(tài)和語(yǔ)態(tài))
評(píng)論
0/150
提交評(píng)論