jt
2021-06-10 5d0d028456874576560552f5a5c4e8b801786f11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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.Threading.Tasks;
using System.Web.Services.Description;
using System.Xml;
using System.Xml.Serialization;
 
namespace HH.WMS.Common
{
    public class WebServiceAgent
    {
 
 
        private WebServiceAgent()
        {
        }
        private object agent;
        private Type agentType;
        private const string CODE_NAMESPACE = "Beyondbit.WebServiceAgent.Dynamic";
 
        /// <summary<   
        /// 构造函数   
        /// </summary<   
        /// <param name="url"<</param<   
        public WebServiceAgent(string url)
        {
 
            // XmlTextReader reader = new XmlTextReader(url + "?wsdl");
            WebClient web = new WebClient();
            Stream stream = web.OpenRead(url + "?wsdl");
 
            //创建和格式化 WSDL 文档   
            ServiceDescription sd = ServiceDescription.Read(stream);
 
            //创建客户端代理代理类   
            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
            sdi.ProtocolName = "Soap"; // 指定访问协议。
            sdi.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。
            sdi.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
 
            sdi.AddServiceDescription(sd, null, null);
            //使用 CodeDom 编译客户端代理类   
            CodeNamespace cn = new CodeNamespace();
            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(cn);
 
            ServiceDescriptionImportWarnings warning = sdi.Import(cn, ccu);
            // CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");
 
            CompilerParameters parameter = new CompilerParameters();
            parameter.GenerateExecutable = false;
            parameter.GenerateInMemory = true;
            parameter.ReferencedAssemblies.Add("System.dll");
            parameter.ReferencedAssemblies.Add("System.XML.dll");
            parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
            parameter.ReferencedAssemblies.Add("System.Data.dll");
            // Microsoft.CSharp.CSharpCodeProvider icc = new Microsoft.CSharp.CSharpCodeProvider();
            // CompilerParameters cp = new CompilerParameters();
            CompilerResults cr = icc.CompileAssemblyFromDom(parameter, ccu);
 
           // Type[] t = cr.CompiledAssembly.GetTypes();
            agentType = cr.CompiledAssembly.GetTypes()[0];
            agent = Activator.CreateInstance(agentType);
 
 
        }
 
        ///<summary<   
        ///调用指定的方法   
        ///</summary<   
        ///<param name="methodName"<方法名,大小写敏感</param<   
        ///<param name="args"<参数,按照参数顺序赋值</param<   
        ///<returns<Web服务的返回值</returns<   
        public object Invoke(string methodName, params object[] args)
        {
            try
            {
                MethodInfo mi = agentType.GetMethod(methodName);
                return this.Invoke(mi, args);
            }
            catch (Exception e) { throw e; }
        }
 
        ///<summary<   
        ///调用指定方法   
        ///</summary<   
        ///<param name="method"<方法信息</param<   
        ///<param name="args"<参数,按照参数顺序赋值</param<   
        ///<returns<Web服务的返回值</returns<   
        public object Invoke(MethodInfo method, params object[] args)
        {
            try
            {
                return method.Invoke(agent, args);
            }
            catch (Exception ex)
            {
                return "<Res><ErrCode>99999</ErrCode><Result>" + ex.Message + "</Result></Res>";
            }
        }
        public MethodInfo[] Methods
        {
            get
            {
                return agentType.GetMethods();
            }
        }
 
 
 
 
        /// <summary>  
        /// 动态调用WebService  
        /// </summary>  
        /// <param name="url">WebService地址</param>  
        /// <param name="classname">类名</param>  
        /// <param name="methodname">方法名(模块名)</param>  
        /// <param name="args">参数列表</param>  
        /// <returns>object</returns>  
        public object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "ServiceBase.WebService.DynamicWebLoad";
            if (classname == null || classname == "")
            {
                classname = this.GetClassName(url);
            }
            //获取服务描述语言(WSDL)  
            System.Net.WebClient wc = new System.Net.WebClient();
            System.IO.Stream stream = wc.OpenRead(url + "?WSDL");
            ServiceDescription sd = ServiceDescription.Read(stream);
            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
            sdi.AddServiceDescription(sd, "", "");
            CodeNamespace cn = new CodeNamespace(@namespace);
            //生成客户端代理类代码  
            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(cn);
            sdi.Import(cn, ccu);
            Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
            ICodeCompiler icc = csc.CreateCompiler();
            //设定编译器的参数  
            CompilerParameters cplist = new CompilerParameters();
            cplist.GenerateExecutable = false;
            cplist.GenerateInMemory = true;
            cplist.ReferencedAssemblies.Add("System.dll");
            cplist.ReferencedAssemblies.Add("System.XML.dll");
            cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
            cplist.ReferencedAssemblies.Add("System.Data.dll");
            //编译代理类  
            CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
            if (true == cr.Errors.HasErrors)
            {
                System.Text.StringBuilder sb = new StringBuilder();
                foreach (CompilerError ce in cr.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(System.Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }
            //生成代理实例,并调用方法  
            System.Reflection.Assembly assembly = cr.CompiledAssembly;
            Type t = assembly.GetType(@namespace + "." + classname, true, true);
            object obj = Activator.CreateInstance(t);
            System.Reflection.MethodInfo mi = t.GetMethod(methodname);
            return mi.Invoke(obj, args);
        }
 
        private string GetClassName(string url)
        {
            string[] parts = url.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');
            return pps[0];
        }
    }
}