關(guān)于C# .NET 動(dòng)態(tài)調(diào)用webservice的三種方式_第1頁(yè)
關(guān)于C# .NET 動(dòng)態(tài)調(diào)用webservice的三種方式_第2頁(yè)
關(guān)于C# .NET 動(dòng)態(tài)調(diào)用webservice的三種方式_第3頁(yè)
關(guān)于C# .NET 動(dòng)態(tài)調(diào)用webservice的三種方式_第4頁(yè)
關(guān)于C# .NET 動(dòng)態(tài)調(diào)用webservice的三種方式_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論