在C#中如何实现动态调用WebService?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
WebServiceHelper代码:
using Microsoft.CSharp; using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Web.Services.Description; using System.Xml.Serialization; namespace SunCreate.HaiKang8600WebService.Utils { /// <summary> /// 动态调用WebService /// </summary> public static class WebServiceHelper { /// <summary> /// 动态调用WebService /// </summary> /// <param name="url">WebService地址</param> /// <param name="strNamespace">命名空间</param> /// <param name="className">类名</param> /// <param name="methodName">方法名(模块名)</param> /// <param name="args">参数列表</param> public static object InvokeWebService(string url, string strNamespace, string className, string methodName, object[] args) { try { WebClient webClient = new WebClient(); Stream stream = webClient.OpenRead(url); //获取服务描述语言(WSDL) ServiceDescription serviceDescription = ServiceDescription.Read(stream); //通过直接从 Stream实例加载 XML 来初始化ServiceDescription类的实例。 ServiceDescriptionImporter serviceDescriptionImporter = new ServiceDescriptionImporter(); serviceDescriptionImporter.AddServiceDescription(serviceDescription, null, null); //生成客户端代理类代码 CodeNamespace codeNamespace = new CodeNamespace(strNamespace); //CodeNamespace表示命名空间声明。 CodeCompileUnit codeCompileUnit = new CodeCompileUnit(); codeCompileUnit.Namespaces.Add(codeNamespace); serviceDescriptionImporter.Import(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); if (true == compilerResults.Errors.HasErrors) { StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in compilerResults.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = compilerResults.CompiledAssembly; Type type = assembly.GetType(strNamespace + "." + className, true, true); object obj = Activator.CreateInstance(type); System.Reflection.MethodInfo methodInfo = type.GetMethod(methodName); //MethodInfo 的实例可以通过调用GetMethods或者Type对象或派生自Type的对象的GetMethod方法来获取,还可以通过调用表示泛型方法定义的 MethodInfo 的MakeGenericMethod方法来获取。 return methodInfo.Invoke(obj, args); } catch (Exception ex) { LogUtil.LogError(ex, "动态调用WebService 错误"); return null; } } } }
使用示例:
string url = "http://172.16.36.26:8080/attachment/services/AttachmentService?wsdl"; object[] args = new object[2]; args[0] = "1"; args[1] = "1"; object str = WebServiceHelper.InvokeWebService(url, "service.webservice", "AttachmentService", "checkGrade", args); string sstr = str.ToString();
看完上述内容,你们掌握在C#中如何实现动态调用WebService的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。