C#中怎么动态调用WebService

本篇文章为大家展示了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,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


分享文章:C#中怎么动态调用WebService
当前链接:http://scyanting.com/article/gjheeg.html