介绍
在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的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!