本篇文章为大家展示了C#中怎么动态调用WebService,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
成都创新互联网络公司拥有10余年的成都网站开发建设经验,数千家客户的共同信赖。提供做网站、网站制作、网站开发、网站定制、买友情链接、建网站、网站搭建、成都响应式网站建设公司、网页设计师打造企业风格,提供周到的售前咨询和贴心的售后服务
public static object InvokeWebService(string url, string methodname, object[] args)
其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。
要实现这样的功能,你需要这几个方面的技能:反射、CodeDom、编程使用C#编译器、WebService。在了解这些知识后,就可以容易的实现web服务的动态调用了:
usingSystem.CodeDom.Compiler; usingSystem; usingSystem.Net; usingSystem.CodeDom; usingMicrosoft.CSharp; usingSystem.IO; usingSystem.Web.Services.Description; usingSystem.Collections.Generic; usingSystem.Reflection; namespacecjl.WebServices { publicclassDynamicWebServices { staticSortedList〈string,Type〉_typeList= newSortedList〈string,Type〉(); #regionInvokeWebService staticstringGetCacheKey(stringurl, stringclassName) { returnurl.ToLower()+className; } staticTypeGetTypeFromCache(stringurl, stringclassName) { stringkey=GetCacheKey(url,className); foreach(KeyValuePair〈string,Type〉 pairin_typeList) { if(key==pair.Key) { returnpair.Value; } } returnnull; } staticTypeGetTypeFromWebService (stringurl,stringclassName) { string@namespace="EnterpriseServerBase. WebService.DynamicWebCalling"; if((className==null)||(className=="")) { className=GetWsClassName(url); } //获取WSDL WebClientwc=newWebClient(); Streamstream=wc.OpenRead(url+"?WSDL"); ServiceDescriptionsd=ServiceDescription. Read(stream); ServiceDescriptionImportersdi= newServiceDescriptionImporter(); sdi.AddServiceDescription(sd,"",""); CodeNamespacecn=newCodeNamespace (@namespace); //生成客户端代理类代码 CodeCompileUnitccu=newCodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn,ccu); CSharpCodeProvidercsc=newCSharpCodeProvider(); ICodeCompilericc=csc.CreateCompiler(); //设定编译参数 CompilerParameterscplist=newCompilerParameters(); cplist.GenerateExecutable=false; cplist.GenerateInMemory=true; cplist.ReferencedAssemblies.Add ("System.dll"); cplist.ReferencedAssemblies.Add ("System.XML.dll"); cplist.ReferencedAssemblies.Add ("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add ("System.Data.dll"); //编译代理类 CompilerResultscr= icc.CompileAssemblyFromDom(cplist,ccu); if(true==cr.Errors.HasErrors) { System.Text.StringBuildersb= newSystem.Text.StringBuilder(); foreach(System.CodeDom.Compiler. CompilerErrorceincr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } thrownewException(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assemblyassembly= cr.CompiledAssembly; Typet=assembly.GetType(@namespace+". "+className,true,true); returnt; } //动态调用web服务 publicstaticobjectInvokeWebService (stringurl,stringmethodName,object[]args) { returnInvokeWebService(url,null, methodName,args); } publicstaticobjectInvokeWebService(stringurl, stringclassName,stringmethodName,object[]args) { try { Typet=GetTypeFromCache(url,className); if(t==null) { t=GetTypeFromWebService(url,className); //添加到缓冲中 stringkey=GetCacheKey(url,className); _typeList.Add(key,t); } objectobj=Activator.CreateInstance(t); MethodInfomi=t.GetMethod(methodName); returnmi.Invoke(obj,args); } catch(Exceptionex) { thrownewException(ex.InnerException.Message, newException(ex.InnerException.StackTrace)); } } privatestaticstringGetWsClassName(stringwsUrl) { string[]parts=wsUrl.Split('/'); string[]pps=parts[parts.Length-1].Split('.'); returnpps[0]; } #endregion } }
上面的注释已经很好的说明了各代码段的功能,下面给个例子看看,这个例子是通过访问http://www.webservicex.net/globalweather.asmx服务来获取各大城市的天气状况。
string url = "http://www.webservicex. net/globalweather.asmx"; string[] args = new string[2]; args[0] = this.textBox_CityName.Text; args[1] = "China"; object result = WebServiceHelper. InvokeWebService(url, "GetWeather", args); this.label_Result.Text = result.ToString();
上述内容就是C#中怎么动态调用WebService,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。