动态编译webservice的方法
2009-08-27 15:40
225 查看
using System.CodeDom.Compiler;
using System;
using System.Net;
using System.CodeDom;
using Microsoft.CSharp;
using System.IO;
using System.Web.Services.Description;
using System.Collections.Generic;
using System.Reflection;
namespace VacationCategory
{
public class DynamicWebServices
{
static SortedList<string, Type> _typeList = new SortedList<string, Type>();
#region InvokeWebService
static string GetCacheKey(string url, string className)
{
return url.ToLower() + className;
}
public static Type GetTypeFromCache(string url, string className)
{
string key = GetCacheKey(url, className);
foreach (KeyValuePair<string, Type> pair in _typeList)
{
if (key == pair.Key)
{
return pair.Value;
}
}
return null;
}
public static Type GetTypeFromWebService(string url, string className)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((className == null) || (className == ""))
{
className = GetWsClassName(url);
}
//获取WSDL
WebClient wc = new WebClient();
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);
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 = csc.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;
Type t = assembly.GetType(@namespace + "." + className, true, true);
return t;
}
//动态调用web服务
public static object InvokeWebService(string url, string methodName, object[] args)
{
return InvokeWebService(url, null, methodName, args);
}
public static object InvokeWebService(string url, string className, string methodName, object[] args)
{
try
{
Type t = GetTypeFromCache(url, className);
if (t == null)
{
t = GetTypeFromWebService(url, className);
//添加到缓冲中
string key = GetCacheKey(url, className);
_typeList.Add(key, t);
}
object obj = Activator.CreateInstance(t);
MethodInfo mi = t.GetMethod(methodName);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
#endregion
}
}
可能遇到的问题:
Warning 1 'System.CodeDom.Compiler.CodeDomProvider.CreateCompiler()' is obsolete: 'Callers should not use the ICodeCompiler interface and should instead use the methods directly on the CodeDomProvider class. Those inheriting from CodeDomProvider must still implement this interface, and should exclude this warning or also obsolete this method.' D:\Lion\Study\CompanyCalendar\VacationCategory\DynamicWebServices.cs 62 33 VacationCategory
using System;
using System.Net;
using System.CodeDom;
using Microsoft.CSharp;
using System.IO;
using System.Web.Services.Description;
using System.Collections.Generic;
using System.Reflection;
namespace VacationCategory
{
public class DynamicWebServices
{
static SortedList<string, Type> _typeList = new SortedList<string, Type>();
#region InvokeWebService
static string GetCacheKey(string url, string className)
{
return url.ToLower() + className;
}
public static Type GetTypeFromCache(string url, string className)
{
string key = GetCacheKey(url, className);
foreach (KeyValuePair<string, Type> pair in _typeList)
{
if (key == pair.Key)
{
return pair.Value;
}
}
return null;
}
public static Type GetTypeFromWebService(string url, string className)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((className == null) || (className == ""))
{
className = GetWsClassName(url);
}
//获取WSDL
WebClient wc = new WebClient();
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);
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 = csc.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;
Type t = assembly.GetType(@namespace + "." + className, true, true);
return t;
}
//动态调用web服务
public static object InvokeWebService(string url, string methodName, object[] args)
{
return InvokeWebService(url, null, methodName, args);
}
public static object InvokeWebService(string url, string className, string methodName, object[] args)
{
try
{
Type t = GetTypeFromCache(url, className);
if (t == null)
{
t = GetTypeFromWebService(url, className);
//添加到缓冲中
string key = GetCacheKey(url, className);
_typeList.Add(key, t);
}
object obj = Activator.CreateInstance(t);
MethodInfo mi = t.GetMethod(methodName);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
#endregion
}
}
可能遇到的问题:
Warning 1 'System.CodeDom.Compiler.CodeDomProvider.CreateCompiler()' is obsolete: 'Callers should not use the ICodeCompiler interface and should instead use the methods directly on the CodeDomProvider class. Those inheriting from CodeDomProvider must still implement this interface, and should exclude this warning or also obsolete this method.' D:\Lion\Study\CompanyCalendar\VacationCategory\DynamicWebServices.cs 62 33 VacationCategory
相关文章推荐
- 动态调用WebService方法
- 动态调用WebService 的相关方法
- 动态创建webservice的方法
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
- C#动态调用webservice的方法
- SilverLight动态调用WebService的方法
- C#中Winform动态调用Webservice的方法
- PHP动态编译出现Cannot find autoconf的解决方法
- 动态WebService方法
- Linux驱动静态编译和动态编译方法详解
- Android编译加入第三方动态链接库文件的方法
- .Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#)
- 提问:关于动态编译WebService为dll然后调用WebService的问题,无法返回xml文本
- 整理一下Java动态编译Java代码,并在加载到内存中然后执行类中方法的api的介绍
- c#动态调用Webservice的两种方法实例
- 动态编译,远端调用Windchill方法
- Silverlight动态调用WEBSERVICE,WCF方法
- webService动态编译(编译在内存中,不会有权限问题)
- 让一个动态链接库文件debug和release编译的时候生成不同的文件名的方法
- C#中自定义方法,动态编译,生成dll文件