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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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í)候我們通過 添加 Web 引用. 創(chuàng)建客戶端代理類的方式調(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)建客戶端代理類。4. 使用 CodeDom 動(dòng)態(tài)創(chuàng)建客戶端代理類程序集。5

2、. 利用反射調(diào)用相關(guān) WebService 方法。上述步驟需要引用如下四個(gè)名稱空間: 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è)名稱空間中包括如下幾個(gè)重要的類:using System.Web.Services.Description下:ServiceDescription /WS描述ServiceDescriptionImporter

3、/通過描述生成客戶端代理類,特別注意其中的Style以下是MSDN對(duì)其的描述: XML Web services 的接口通常由 Web 服務(wù)描述語言 (WSDL) 文件來說明。例如,若要獲取有關(guān)使用 http:/localhost/service.asmx 處公開的 ASP.NET 的 Web 服務(wù)的 WSDL 說明,只需導(dǎo)航到 http:/localhost/service.asmx?WSDL。使用 ServiceDescriptionImporter 類可以方便地將 WSDL 說明中包含的信息導(dǎo)入到 System.CodeDom.CodeCompileUnit 對(duì)象。通過調(diào)整 Style

4、參數(shù)的值,可以指示 ServiceDescriptionImporter 實(shí)例生成客戶端代理類(通過透明調(diào)用該類可提供 Web 服務(wù)的功能)或生成抽象類(該類封裝 Web 服務(wù)的功能而不實(shí)現(xiàn)該功能)。如果將 Style 屬性設(shè)置為 Client,則 ServiceDescriptionImporter 生成客戶端代理類,通過調(diào)用這些類來提供說明的 Web 服務(wù)的功能。如果將 Style 屬性設(shè)置為 Server,則 ServiceDescriptionImporter 實(shí)例生成抽象類,這些類表示所說明的 XML Web services 的功能而不進(jìn)行實(shí)現(xiàn)。然后,可以通過編寫從這些抽象類繼承的

5、類來對(duì)其進(jìn)行實(shí)現(xiàn),并實(shí)現(xiàn)相關(guān)的方法。using System.CodeDom下: CodedomUnit /它用于設(shè)定動(dòng)態(tài)代碼的名稱空間,類名等,可以通過ServiceDescriptionImporter.Import()方法將WS的描述代碼寫入該類,以作動(dòng)態(tài)編譯用 using System.CodeDom.Compiler下:CodedomProvider /用于創(chuàng)建和檢索代碼生成器和代碼編譯器的實(shí)例,我們主要用到其實(shí)現(xiàn)子類CShareCodeProvider可以直接用CShareCodeProvider provider=new CShareCodeProvider()來生成,或者用Co

6、dedomProvider.CreateProvider(CSharp)來生成ICodeCompiler /用于編譯基于 System.CodeDom 的源代碼表示形式。 它通過CodedomProvider的CreateCompiler()方法來CompilerResults /表示從編譯器返回的編譯結(jié)果。 它由ICodeCompiler根據(jù)指定的編譯器設(shè)置從指定的 CodeCompileUnit 所包含的 System.CodeDom 樹中編譯程序集并返回。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客戶端動(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)建客戶端代理代理類。ServiceDescriptionImporter importer = new ServiceD

10、escriptionImporter();importer.ProtocolName = Soap; / 指定訪問協(xié)議。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 調(diào)用 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. 生成客戶端代理程序集文件上面的代碼通過在內(nèi)存中創(chuàng)建動(dòng)態(tài)程序集的方 式完成了動(dòng)態(tài)調(diào)用過程。如果我們希望將客戶端代理類生成程序集文件保存到硬盤,則可以進(jìn)行如下修改。生成程序集文件后,我們可以通過 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)建客戶端代理代理類。ServiceDescriptionImporter importer = new ServiceDescriptionImporter();importer.ProtocolName = Soap; / 指定訪問協(xié)議。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)/ 顯示編譯錯(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. 獲取客戶端代理類源代

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. 創(chuàng)建和格式化 WSDL 文檔。ServiceDescription description = ServiceDescription.Read(stream);/ 3. 創(chuàng)建客戶端代理代理類。ServiceDescriptionImporter importer = new ServiceDescriptionImporter();importer.ProtocolName = Soap; / 指定訪問協(xié)議

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. 保存源代碼到文件。當(dāng)然,你也可以直接保存到內(nèi)存字符串中。Tex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論