动态加载webservice

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;

namespace BLL
{
public class WebServicesHelper
{
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split(‘/‘);
string[] pps = parts[parts.Length - 1].Split(‘.‘);
return pps[0];
}

public static object InvokeWebService(string url, string methodname, object[] args)
{
return WebServicesHelper.InvokeWebService(url, null, methodname, args);
}

public static object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "BLL";
if ((classname == null) || (classname == ""))
{
// classname = "CLS";
classname = WebServicesHelper.GetWsClassName(url);
}
try
{
WebClient wc = new WebClient();
// Stream stream = wc.OpenRead(url + "?wsdl");
Stream stream = wc.OpenRead(url);
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);
CSharpCodeProvider csc = new 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 System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.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;
//InitDocare.LogA.Debug("name:" + @namespace + "." + classname);

//InitDocare.LogA.Debug("fullName:" + assembly.FullName);
//InitDocare.LogA.Debug("GetName:" + assembly.GetName());

Type[] types = assembly.GetTypes();
System.Reflection.MethodInfo mi = null;
Type T = null;
object obj = null;
foreach (Type t in types)
{
T = t;
//object obj = Activator.CreateInstance(t);

foreach (System.Reflection.MethodInfo info in t.GetMethods())
{
if (info.Name == methodname)
{
mi = info;
obj = Activator.CreateInstance(T);
if (obj != null)
{
return mi.Invoke(obj, args);
}
}
}
}
return null;
//Type te = assembly.GetType("WebMouthService", true, true);

//System.Reflection.MethodInfo mi = te.GetMethod(methodname);
//if (mi == null)
//{
// InitDocare.LogA.Debug("mi is null");
// return null;
//}
}
catch (Exception ex)
{
return null;
//InitDocare.LogA.Debug(ex.Message + "调用堆栈上的桢的字符串表现形式:" + ex.StackTrace + "\r\n引发当前异常的函数为:" + ex.TargetSite.Name + "\r\n导致错误的应用程序或对象的名称为:" + ex.Source + "\r\n");
//throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
}
}

 

相关文章