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];
|
}
|
}
|
}
|