日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在C#中動(dòng)態(tài)調(diào)用WebService

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

上面的注釋已經(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)要漂亮的多。


網(wǎng)站標(biāo)題:在C#中動(dòng)態(tài)調(diào)用WebService
分享URL:http://m.5511xx.com/article/cojsihd.html