WebServiceHelper类

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 }
作者:wpf之家
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/wpf123/p/2347381.html