成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在C#中動(dòng)態(tài)調(diào)用WebService

開發(fā) 后端
通常我們?cè)诔绦蛑行枰{(diào)用WebService時(shí),都是通過“添加Web引用”。本文向您介紹使用C#中動(dòng)態(tài)調(diào)用WebService的方法達(dá)到目的。

通常我們?cè)诔绦蛑行枰{(diào)用WebService時(shí),都是通過“添加Web引用”,讓VS.NET環(huán)境來為我們生成服務(wù)代理,然后調(diào)用對(duì)應(yīng)的Web服務(wù)。這樣是使工作簡單了,但是卻和提供Web服務(wù)的URL、方法名、參數(shù)綁定在一起了,這是VS.NET自動(dòng)為我們生成Web服務(wù)代理的限制。如果哪一天發(fā)布Web服務(wù)的URL改變了,則我們需要重新讓VS.NET生成代理,并重新編譯。在某些情況下,這可能是不能忍受的,我們需要C#中動(dòng)態(tài)調(diào)用WebService的能力。比如我們可以把Web服務(wù)的URL保存在配置文件中,這樣,當(dāng)服務(wù)URL改變時(shí),只需要修改配置文件就可以了。

說了這么多,實(shí)際上我們要實(shí)現(xiàn)這樣的功能:

  1. public static object InvokeWebService(string url,   
  2. string methodname, object[] args) 

其中,url是Web服務(wù)的地址,methodname是要調(diào)用服務(wù)方法名,args是要調(diào)用Web服務(wù)所需的參數(shù),返回值就是web服務(wù)返回的結(jié)果了。

要實(shí)現(xiàn)這樣的功能,你需要這幾個(gè)方面的技能:反射、CodeDom、編程使用C#編譯器、WebService。在了解這些知識(shí)后,就可以容易的實(shí)現(xiàn)web服務(wù)的動(dòng)態(tài)調(diào)用了:

  1. usingSystem.CodeDom.Compiler;  
  2. usingSystem;  
  3. usingSystem.Net;  
  4. usingSystem.CodeDom;  
  5. usingMicrosoft.CSharp;  
  6. usingSystem.IO;  
  7. usingSystem.Web.Services.Description;  
  8. usingSystem.Collections.Generic;  
  9. usingSystem.Reflection;  
  10. namespacecjl.WebServices  
  11. {  
  12. publicclassDynamicWebServices  
  13. {  
  14. staticSortedList〈string,Type〉_typeList=  
  15. newSortedList〈string,Type〉();  
  16.  
  17. #regionInvokeWebService  
  18.  
  19. staticstringGetCacheKey(stringurl,  
  20. stringclassName)  
  21. {  
  22. returnurl.ToLower()+className;  
  23. }  
  24. staticTypeGetTypeFromCache(stringurl,  
  25. stringclassName)  
  26. {  
  27. stringkey=GetCacheKey(url,className);  
  28. foreach(KeyValuePair〈string,Type〉  
  29. pairin_typeList)  
  30. {  
  31. if(key==pair.Key)  
  32. {  
  33. returnpair.Value;  
  34. }  
  35. }  
  36.  
  37. returnnull;  
  38. }  
  39. staticTypeGetTypeFromWebService  
  40. (stringurl,stringclassName)  
  41. {  
  42. string@namespace="EnterpriseServerBase.  
  43. WebService.DynamicWebCalling";  
  44. if((className==null)||(className==""))  
  45. {  
  46. className=GetWsClassName(url);  
  47. }  
  48.  
  49. //獲取WSDL  
  50. WebClientwc=newWebClient();  
  51. Streamstream=wc.OpenRead(url+"?WSDL");  
  52. ServiceDescriptionsd=ServiceDescription.  
  53. Read(stream);  
  54. ServiceDescriptionImportersdi=  
  55. newServiceDescriptionImporter();  
  56. sdi.AddServiceDescription(sd,"","");  
  57. CodeNamespacecn=newCodeNamespace  
  58. (@namespace);  
  59.  
  60. //生成客戶端代理類代碼  
  61. CodeCompileUnitccu=newCodeCompileUnit();  
  62. ccu.Namespaces.Add(cn);  
  63. sdi.Import(cn,ccu);  
  64. CSharpCodeProvidercsc=newCSharpCodeProvider();  
  65. ICodeCompilericc=csc.CreateCompiler();  
  66.  
  67. //設(shè)定編譯參數(shù)  
  68. CompilerParameterscplist=newCompilerParameters();  
  69. cplist.GenerateExecutable=false;  
  70. cplist.GenerateInMemory=true;  
  71. cplist.ReferencedAssemblies.Add 
  72. ("System.dll");  
  73. cplist.ReferencedAssemblies.Add 
  74. ("System.XML.dll");  
  75. cplist.ReferencedAssemblies.Add 
  76. ("System.Web.Services.dll");  
  77. cplist.ReferencedAssemblies.Add 
  78. ("System.Data.dll");  
  79.  
  80. //編譯代理類  
  81. CompilerResultscr=  
  82. icc.CompileAssemblyFromDom(cplist,ccu);  
  83. if(true==cr.Errors.HasErrors)  
  84. {  
  85. System.Text.StringBuildersb=  
  86. newSystem.Text.StringBuilder();  
  87. foreach(System.CodeDom.Compiler.  
  88. CompilerErrorceincr.Errors)  
  89. {  
  90. sb.Append(ce.ToString());  
  91. sb.Append(System.Environment.NewLine);  
  92. }  
  93. thrownewException(sb.ToString());  
  94. }  
  95.  
  96. //生成代理實(shí)例,并調(diào)用方法  
  97. System.Reflection.Assemblyassembly=  
  98. cr.CompiledAssembly;  
  99. Typet=assembly.GetType(@namespace+".  
  100. "+className,true,true);  
  101. returnt;  
  102. }  
  103.  
  104. //動(dòng)態(tài)調(diào)用web服務(wù)  
  105. publicstaticobjectInvokeWebService  
  106. (stringurl,stringmethodName,object[]args)  
  107. {  
  108. returnInvokeWebService(url,null,  
  109. methodName,args);  
  110. }  
  111.  
  112. publicstaticobjectInvokeWebService(stringurl,  
  113. stringclassName,stringmethodName,object[]args)  
  114. {  
  115. try  
  116. {  
  117. Typet=GetTypeFromCache(url,className);  
  118. if(t==null)  
  119. {  
  120. t=GetTypeFromWebService(url,className);  
  121.  
  122. //添加到緩沖中  
  123. stringkey=GetCacheKey(url,className);  
  124. _typeList.Add(key,t);  
  125. }  
  126.  
  127. objectobj=Activator.CreateInstance(t);  
  128. MethodInfomi=t.GetMethod(methodName);  
  129. returnmi.Invoke(obj,args);  
  130. }  
  131. catch(Exceptionex)  
  132. {  
  133. thrownewException(ex.InnerException.Message,  
  134. newException(ex.InnerException.StackTrace));  
  135. }  
  136. }  
  137. privatestaticstringGetWsClassName(stringwsUrl)  
  138. {  
  139. string[]parts=wsUrl.Split('/');  
  140. string[]pps=parts[parts.Length-1].Split('.');  
  141. returnpps[0];  
  142. }  
  143. #endregion  
  144. }  
  145. }  

上面的注釋已經(jīng)很好的說明了各代碼段的功能,下面給個(gè)例子看看,這個(gè)例子是通過訪問http://www.webservicex.net/globalweather.asmx服務(wù)來獲取各大城市的天氣狀況。

  1. string url = "http://www.webservicex.  
  2. net/globalweather.asmx";  
  3. string[] args = new string[2];  
  4. args[0] = this.textBox_CityName.Text;  
  5. args[1] = "China";  
  6. object result = WebServiceHelper.  
  7. InvokeWebService(url, "GetWeather", args);  
  8. this.label_Result.Text = result.ToString();  

上述的例子中,調(diào)用web服務(wù)使用了兩個(gè)參數(shù),***個(gè)是城市的名字,第二個(gè)是國家的名字,Web服務(wù)返回的是XML文檔,可以從其中解析出溫度、風(fēng)力等天氣情況。

***說一下,C#雖然仍屬于靜態(tài)語言之列,但是其動(dòng)態(tài)能力也是很強(qiáng)大的,不信,你可以看看Spring.net的AOP實(shí)現(xiàn),這種“無侵入”的AOP實(shí)現(xiàn)比通常的.NET聲明式AOP實(shí)現(xiàn)(一般是通過AOP Attribute)要漂亮的多。

【編輯推薦】

  1. 如何使用C#創(chuàng)建WebService
  2. C# WebService更新客戶端軟件
  3. 簡明教程 C# Webservice實(shí)例
  4. C# Web Service異常處理的兩個(gè)常見問題
  5. Web Services&XML:什么是Web Service
責(zé)任編輯:冰荷 來源: 比特網(wǎng)
相關(guān)推薦

2015-07-09 10:44:48

C#WebService

2009-08-06 17:57:14

C# webServiC# WebServi

2009-08-12 18:14:00

C# WebServi

2009-08-07 13:55:35

Java客戶端類調(diào)用C# WebServi

2024-09-20 18:02:42

C#數(shù)據(jù)庫SQLite

2009-08-06 16:44:03

C#創(chuàng)建WebServ

2024-06-12 07:48:24

C#WebService.NET

2009-08-03 11:32:49

C#調(diào)用COM對(duì)象

2009-08-07 14:10:13

C# WebserviDelphi

2009-08-06 17:45:08

C# Webservi

2009-08-05 16:29:18

C#調(diào)用C++動(dòng)態(tài)鏈接

2024-03-01 20:59:11

C#DLL開發(fā)

2009-08-06 17:12:13

C# WebServi

2009-08-17 16:18:47

C#調(diào)用CreateO

2009-07-02 10:07:24

C# 4.0的動(dòng)態(tài)類型Visual Stud

2009-08-11 14:16:00

Winform調(diào)用WEC#

2009-08-20 10:34:46

C#中聲明API函數(shù)

2009-02-03 09:33:26

動(dòng)態(tài)類型動(dòng)態(tài)編程C# 4.0

2009-08-05 16:49:42

C#中調(diào)用dll

2009-07-31 15:47:20

Win32 APIC#
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人中文字幕在线 | 三级成人在线 | 国产一区不卡 | 天天天操天天天干 | 欧美人成在线视频 | 国产精品视频 | 国产精品久久久久无码av | 天堂一区二区三区 | 精品自拍视频在线观看 | 日韩一级黄色片 | 午夜免费网 | 亚洲欧美在线观看 | www.成人.com| 欧美一区二区三区在线播放 | 亚洲国产精品suv | 在线视频h | 一级毛片色一级 | 久久伊| 国产a级毛毛片 | 日韩精品在线观看免费 | 成人一级视频在线观看 | 五月槐花香 | 日韩电影一区 | 国产黄色大片 | 欧美精品在线一区 | 日韩中文在线视频 | 日韩在线不卡 | 91精品在线看 | 日韩不卡视频在线 | 久青草影院| 久久久久久久久久久久久久久久久久久久 | 欧美日高清视频 | 国产精品中文 | 日本欧美在线观看视频 | 亚洲第一网站 | 亚洲国产精品一区 | 久久激情网 | 久久久久国产精品一区二区 | 日韩手机视频 | 毛片一区二区三区 | 一区二区三区四区五区在线视频 |