动态调用WEBSERVICE,减少改WS就要重新生成代理类
发布时间:2020-12-17 01:14:25 所属栏目:安全 来源:网络整理
导读:?/// summary ? ? /// WS代理帮助类 ? ? /// /summary ? ? public class WSProxyHelper ? ? { ? ? ? ? public static object InvokeWebServcieMethod(string url,string @namespace,string classname,string methodname,object[] args) ? ? ? ? { ? ? ? ? ?
?/// <summary> ? ? /// WS代理帮助类 ? ? /// </summary> ? ? public class WSProxyHelper ? ? { ? ? ? ? public static object InvokeWebServcieMethod(string url,string @namespace,string classname,string methodname,object[] args) ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? WebClient client = new WebClient(); ? ? ? ? ? ? ? ? Stream stream = client.OpenRead(url+"?WSDL"); ? ? ? ? ? ? ? ? ServiceDescription description = ServiceDescription.Read(stream); ? ? ? ? ? ? ? ? ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。 ? ? ? ? ? ? ? ? importer.ProtocolName = "Soap"; //指定访问协议。 ? ? ? ? ? ? ? ? importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。 ? ? ? ? ? ? ? ? importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; ? ? ? ? ? ? ? ? importer.AddServiceDescription(description,null,null); //添加WSDL文档。 ? ? ? ? ? ? ? ? CodeNamespace nmspace = new CodeNamespace(); //命名空间 ? ? ? ? ? ? ? ? nmspace.Name = @namespace; ? ? ? ? ? ? ? ? CodeCompileUnit unit = new CodeCompileUnit(); ? ? ? ? ? ? ? ? unit.Namespaces.Add(nmspace); ? ? ? ? ? ? ? ? ServiceDescriptionImportWarnings warning = importer.Import(nmspace,unit); ? ? ? ? ? ? ? ? CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); ? ? ? ? ? ? ? ? CompilerParameters parameter = new CompilerParameters(); ? ? ? ? ? ? ? ? parameter.GenerateInMemory = true; ? ? ? ? ? ? ? ? parameter.GenerateExecutable = false; ? ? ? ? ? ? ? ? parameter.TreatWarningsAsErrors = false; ? ? ? ? ? ? ? ? parameter.WarningLevel = 4; ? ? ? ? ? ? ? ? parameter.ReferencedAssemblies.Add("System.dll"); ? ? ? ? ? ? ? ? parameter.ReferencedAssemblies.Add("System.XML.dll"); ? ? ? ? ? ? ? ? parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); ? ? ? ? ? ? ? ? parameter.ReferencedAssemblies.Add("System.Data.dll"); ? ? ? ? ? ? ? ? CompilerResults result = provider.CompileAssemblyFromDom(parameter,unit); ? ? ? ? ? ? ? ? if (result.Errors.HasErrors) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? // 显示编译错误信息 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? Assembly asm = result.CompiledAssembly;// Assembly.LoadFrom("MyTest.dll");//加载前面生成的程序集 ? ? ? ? ? ? ? ? Type t = asm.GetType(@namespace + "." + classname); ? ? ? ? ? ? ? ? object o = Activator.CreateInstance(t); ? ? ? ? ? ? ? ? MethodInfo method = t.GetMethod(methodname);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下 ? ? ? ? ? ? ? ? object item = method.Invoke(o,args); ? ? ? ? ? ? ? ? //上面是根据WebService地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面 ? ? ? ? ? ? ? ? //TextWriter writer = File.CreateText("MyTest.cs"); ? ? ? ? ? ? ? ? //provider.GenerateCodeFromCompileUnit(unit,writer,null); ? ? ? ? ? ? ? ? //writer.Flush(); ? ? ? ? ? ? ? ? //writer.Close(); ? ? ? ? ? ? ? ? return item; ? ? ? ? ? ? } ? ? ? ? ? ? catch (Exception ex) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace)); ? ? ? ? ? ? } ? ? ? ? } ? ? }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Pexpect模块的pxssh扩展子模块详解
- 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子
- angularjs – $rootScope.$on vs $scope.$on.之间的差异
- 三、Shell中分支与循环结构
- AngularJS2 学习笔记——TypeScript
- angularjs解决方案之 Form表单中按钮提交
- angularjs-directive – AngularJS – 在指令中使用局部变量
- 浅谈bootstrap使用中的一些问题以及解决过程
- angular – 运行时错误错误:0:0引起:StatusBar没有提供者
- scala – 从Any到AnyRef的通用/通用拳击