代码改变世界

WebServiceHelper类

  观海看云  阅读(471)  评论(0编辑  收藏  举报

01 using System;

02 using System.Collections.Generic;
03 using System.Text;
04   
05 using System.IO;
06 using System.Configuration;
07 using System.CodeDom;
08 using System.CodeDom.Compiler;
09 using System.Net;
10 using System.Web.Services;
11 using System.Web.Services.Description;
12 using Microsoft.CSharp;
13   
14 namespace InvokeWebService
15 {
16     public static class WebServiceHelper
17     {
18         /// <summary>
19         /// 动态调用WebService
20         /// </summary>
21         /// <param name="url">WebService地址</param>
22         /// <param name="methodname">方法名(模块名)</param>
23         /// <param name="args">参数列表</param>
24         /// <returns>object</returns>
25         public static object InvokeWebService(string url, string methodname, object[] args)
26         {
27             return InvokeWebService(url, null, methodname, args);
28         }
29         /// <summary>
30         /// 动态调用WebService
31         /// </summary>
32         /// <param name="url">WebService地址</param>
33         /// <param name="classname">类名</param>
34         /// <param name="methodname">方法名(模块名)</param>
35         /// <param name="args">参数列表</param>
36         /// <returns>object</returns>
37         public static object InvokeWebService(string url, string classname, string methodname, object[] args)
38         {
39             string @namespace = "ServiceBase.WebService.DynamicWebLoad";
40             if (classname == null || classname == "")
41             {
42                 classname = WebServiceHelper.GetClassName(url);
43             }
44             //获取服务描述语言(WSDL)
45             WebClient wc = new WebClient();
46             Stream stream = wc.OpenRead(url + "?WSDL");
47             ServiceDescription sd = ServiceDescription.Read(stream);
48             ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
49             sdi.AddServiceDescription(sd, "", "");
50             CodeNamespace cn = new CodeNamespace(@namespace);
51             //生成客户端代理类代码
52             CodeCompileUnit ccu = new CodeCompileUnit();
53             ccu.Namespaces.Add(cn);
54             sdi.Import(cn, ccu);
55             CSharpCodeProvider csc = new CSharpCodeProvider();
56             ICodeCompiler icc = csc.CreateCompiler();
57             //设定编译器的参数
58             CompilerParameters cplist = new CompilerParameters();
59             cplist.GenerateExecutable = false;
60             cplist.GenerateInMemory = true;
61             cplist.ReferencedAssemblies.Add("System.dll");
62             cplist.ReferencedAssemblies.Add("System.XML.dll");
63             cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
64             cplist.ReferencedAssemblies.Add("System.Data.dll");
65             //编译代理类
66             CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
67             if (true == cr.Errors.HasErrors)
68             {
69                 System.Text.StringBuilder sb = new StringBuilder();
70                 foreach (CompilerError ce in cr.Errors)
71                 {
72                     sb.Append(ce.ToString());
73                     sb.Append(System.Environment.NewLine);
74                 }
75                 throw new Exception(sb.ToString());
76             }
77   
78             //生成代理实例,并调用方法
79             System.Reflection.Assembly assembly = cr.CompiledAssembly;
80             Type t = assembly.GetType(@namespace + "." + classname, true, true);
81             object obj = Activator.CreateInstance(t);
82             System.Reflection.MethodInfo mi = t.GetMethod(methodname);
83             return mi.Invoke(obj, args);
84   
85         }
86   
87         private static string GetClassName(string url)
88         {
89             string[] parts = url.Split('/');
90             string[] pps = parts[parts.Length - 1].Split('.');
91             return pps[0];
92         }
93   
94     }
95 }

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示