在c#中如何实现动态调用网络服务

  介绍

在c#中如何实现动态调用WebService ?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强> WebServiceHelper代码:

;
  使用系统;
  使用System.CodeDom;
  使用System.CodeDom.Compiler;
  使用System.Collections.Generic;
  使用先;
  使用来;
  使用System.Net;
  使用System.Reflection;
  使用text;
  使用System.Web.Services.Description;
  使用System.Xml.Serialization;
  
  名称空间SunCreate.HaiKang8600WebService.Utils
  {///& lt; summary>///动态调用网络服务///& lt;/summary>
  公共静态类WebServiceHelper
  {///& lt; summary>///动态调用网络服务///& lt;/summary>///& lt;参数name=皍rl"在网络服务地址& lt;/param>///& lt;参数name=皊trNamespace"在命名空间& lt;/param>///& lt;参数name=癱lassName"在类名& lt;/param>///& lt;参数name=癿ethodName"在方法名(模块名)& lt;/param>///& lt;参数name=癮rgs"在参数列表& lt;/param>
  公共静态对象InvokeWebService (className strNamespace字符串url字符串,字符串,字符串methodName object[]参数)
  {
  试一试
  {
  WebClient WebClient=new WebClient ();
  流流=webClient.OpenRead (url);//获取服务描述语言(WSDL)
  
  ServiceDescription ServiceDescription=ServiceDescription.Read(流);//通过直接从流实例加载XML来初始化ServiceDescription类的实例。
  ServiceDescriptionImporter ServiceDescriptionImporter=new ServiceDescriptionImporter ();
  serviceDescriptionImporter。AddServiceDescription(来组成,空,空);//生成客户端代理类代码
  CodeNamespace CodeNamespace=new CodeNamespace (strNamespace);//CodeNamespace表示命名空间声明。
  CodeCompileUnit CodeCompileUnit=new CodeCompileUnit ();
  codeCompileUnit.Namespaces.Add (codeNamespace);
  serviceDescriptionImporter。进口(codeNamespace codeCompileUnit);
  
  CSharpCodeProvider CSharpCodeProvider=new CSharpCodeProvider ();
  ICodeCompiler ICodeCompiler=csharpCodeProvider.CreateCompiler();//取得c#程式码编译器的执行个体//设定编译器的参数
  CompilerParameters CompilerParameters=new CompilerParameters();//创建编译器的参数实例
  compilerParameters。GenerateExecutable=false;
  compilerParameters。GenerateInMemory=true;
  compilerParameters.ReferencedAssemblies.Add (“System.dll");
  compilerParameters.ReferencedAssemblies.Add (“System.XML.dll");
  compilerParameters.ReferencedAssemblies.Add (“System.Web.Services.dll");
  compilerParameters.ReferencedAssemblies.Add (“System.Data.dll");//编译代理类
  CompilerResults CompilerResults=iCodeCompiler。CompileAssemblyFromDom (compilerParameters codeCompileUnit);
  如果(真的==compilerResults.Errors.HasErrors)
  {
  StringBuilder某人=new StringBuilder ();
  foreach (compilerResults.Errors CompilerError ce)
  {
  sb.Append (ce.ToString ());
  sb.Append (System.Environment.NewLine);
  }
  抛出新的异常(sb.ToString ());
  }//生成代理实例,并调用方法
  System.Reflection。总成装配=compilerResults.CompiledAssembly;
  型类型=组装。方法(strNamespace +“!”+名字,真的,真的);
  对象obj=Activator.CreateInstance(类型);
  System.Reflection。MethodInfo MethodInfo=type.GetMethod (methodName);//MethodInfo的实例可以通过调用GetMethods或者类型对象或派生自类型的对象的GetMethod方法来获取,还可以通过调用表示泛型方法定义的MethodInfo的MakeGenericMethod方法来获取。
  methodInfo返回。调用(obj, args);
  }
  捕获(异常交货)
  {
  LogUtil。LogError(前女友,“动态调用WebService错误“);
  返回null;
  }
  }
  
  }
  }

使用示例:

字符串url=癶ttp://172.16.36.26:8080/附件/服务/AttachmentService& # 63; wsdl";
  对象[]参数=新对象[2];
  args [0]=?”;
  args [1]=?”;
  str=WebServiceHelper对象。InvokeWebService (url,“service.webservice"“AttachmentService",“checkGrade", args);
  字符串sstr=str.ToString (); 

看完上述内容,你们掌握在c#中如何实现动态调用WebService的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

在c#中如何实现动态调用网络服务