WebServiceAgentOld.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.CodeDom;
  7. using System.CodeDom.Compiler;
  8. using System.Reflection;
  9. using System.Xml;
  10. using System.Web.Services.Description;
  11. using System.IO;
  12. using Microsoft.CSharp;
  13. using System.Web.Services.Protocols;
  14. using System.Diagnostics;
  15. namespace BaseLibComm
  16. {
  17. internal class ProxyObject : MarshalByRefObject
  18. {
  19. Assembly assembly = null;
  20. private Object result = null;
  21. public Object Resutl
  22. {
  23. get { return this.result; }
  24. }
  25. [Obsolete]
  26. public void LoadAssembly(string url, string @namespace)
  27. {
  28. // assembly = Assembly.LoadFile(@"TestDLL.dll");
  29. //获取服务描述语言(WSDL)
  30. DateTime dt = DateTime.Now;
  31. using (WebClient wc = new WebClient())
  32. {
  33. using (Stream stream = wc.OpenRead(url + "?WSDL"))
  34. {
  35. ServiceDescription sd = ServiceDescription.Read(stream);
  36. ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  37. sdi.AddServiceDescription(sd, "", "");
  38. CodeNamespace cn = new CodeNamespace(@namespace);
  39. //生成客户端代理类代码
  40. CodeCompileUnit ccu = new CodeCompileUnit();
  41. ccu.Namespaces.Add(cn);
  42. sdi.Import(cn, ccu);
  43. CSharpCodeProvider csc = new CSharpCodeProvider();
  44. ICodeCompiler icc = csc.CreateCompiler();
  45. //设定编译器的参数
  46. CompilerParameters cplist = new CompilerParameters();
  47. cplist.GenerateExecutable = false;
  48. cplist.GenerateInMemory = false;
  49. cplist.ReferencedAssemblies.Add("System.dll");
  50. cplist.ReferencedAssemblies.Add("System.XML.dll");
  51. cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
  52. cplist.ReferencedAssemblies.Add("System.Data.dll");
  53. //编译代理类
  54. CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
  55. if (true == cr.Errors.HasErrors)
  56. {
  57. System.Text.StringBuilder sb = new StringBuilder();
  58. foreach (CompilerError ce in cr.Errors)
  59. {
  60. sb.Append(ce.ToString());
  61. sb.Append(System.Environment.NewLine);
  62. }
  63. throw new Exception(sb.ToString());
  64. }
  65. //生成代理实例,并调用方法
  66. assembly = cr.CompiledAssembly;
  67. }
  68. }
  69. double elapse = (DateTime.Now - dt).TotalMilliseconds;
  70. }
  71. public bool Invoke(string className, string methodName, params Object[] args)
  72. {
  73. if (assembly == null)
  74. return false;
  75. Type tp = assembly.GetType(className, true, true);
  76. if (tp == null)
  77. return false;
  78. MethodInfo method = tp.GetMethod(methodName);
  79. if (method == null)
  80. return false;
  81. Object obj = Activator.CreateInstance(tp);
  82. result = method.Invoke(obj, args);
  83. return true;
  84. }
  85. }
  86. public class WebServiceAgentOld
  87. {
  88. static CompilerResults _cr = null;
  89. #region InvokeWebService
  90. /// < summary>
  91. /// 动态调用web服务
  92. /// < /summary>
  93. /// < param name="url">WSDL服务地址< /param>
  94. /// < param name="methodname">方法名< /param>
  95. /// < param name="args">参数< /param>
  96. /// < returns>< /returns>
  97. public static object InvokeWebService(string url, string methodname, object[] args)
  98. {
  99. return WebServiceAgentOld.InvokeWebService(url, null, methodname, args);
  100. }
  101. /// < summary>
  102. /// 动态调用web服务
  103. /// < /summary>
  104. /// < param name="url">WSDL服务地址< /param>
  105. /// < param name="classname">类名< /param>
  106. /// < param name="methodname">方法名< /param>
  107. /// < param name="args">参数< /param>
  108. /// < returns>< /returns>
  109. public static object InvokeWebService(string url, string classname, string methodname, object[] args)
  110. {
  111. string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
  112. if (string.IsNullOrEmpty(classname))
  113. {
  114. classname = WebServiceAgentOld.GetWsClassName(url);
  115. }
  116. try
  117. {
  118. ////// classname = @namespace + "." + classname;
  119. ////// AppDomainSetup appDomainSetup = new AppDomainSetup
  120. //////{
  121. ////// ApplicationBase = System.Environment.CurrentDirectory,
  122. ////// DisallowBindingRedirects = false,
  123. ////// DisallowCodeDownload = false,
  124. ////// ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
  125. //////};
  126. ////// // Create the second AppDomain.
  127. ////// // AppDomain appDomain = AppDomain.CreateDomain("SyncTools.WebService.DynamicWebLoad", null, appDomainSetup);
  128. ////// AppDomain appDomain = AppDomain.CreateDomain("SyncTools.WebService.DynamicWebLoad");
  129. ////// Type t = typeof(ProxyObject);
  130. ////// ProxyObject obj = (ProxyObject)appDomain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName);
  131. ////// DateTime dt = DateTime.Now;
  132. ////// obj.LoadAssembly(url, @namespace);
  133. ////// obj.Invoke(classname, methodname, args);
  134. ////// var result = obj.Resutl;
  135. ////// AppDomain.Unload(appDomain);
  136. ////// double elapse = (DateTime.Now - dt).TotalMilliseconds;
  137. ////// appDomain = null;
  138. ////// obj = null;
  139. ////// return result;
  140. //DateTime dt = DateTime.Now;
  141. //获取WSDL
  142. WebClient wc = new WebClient();
  143. Stream stream = wc.OpenRead(url + "?WSDL");
  144. ServiceDescription sd = ServiceDescription.Read(stream);
  145. ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  146. sdi.AddServiceDescription(sd, "", "");
  147. CodeNamespace cn = new CodeNamespace(@namespace);
  148. //生成客户端代理类代码
  149. CodeCompileUnit ccu = new CodeCompileUnit();
  150. ccu.Namespaces.Add(cn);
  151. sdi.Import(cn, ccu);
  152. if(_cr==null)
  153. {
  154. CSharpCodeProvider icc = new CSharpCodeProvider();
  155. //设定编译参数
  156. CompilerParameters cplist = new CompilerParameters();
  157. cplist.GenerateExecutable = false;
  158. cplist.GenerateInMemory = true;
  159. cplist.ReferencedAssemblies.Add("System.dll");
  160. cplist.ReferencedAssemblies.Add("System.XML.dll");
  161. cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
  162. cplist.ReferencedAssemblies.Add("System.Data.dll");
  163. //编译代理类
  164. //CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
  165. _cr = icc.CompileAssemblyFromDom(cplist, ccu);
  166. if (true == _cr.Errors.HasErrors)
  167. {
  168. System.Text.StringBuilder sb = new System.Text.StringBuilder();
  169. foreach (System.CodeDom.Compiler.CompilerError ce in _cr.Errors)
  170. {
  171. sb.Append(ce.ToString());
  172. sb.Append(System.Environment.NewLine);
  173. }
  174. throw new Exception(sb.ToString());
  175. }
  176. }
  177. //生成代理实例,并调用方法
  178. //System.Reflection.Assembly assembly = cr.CompiledAssembly;
  179. System.Reflection.Assembly assembly = _cr.CompiledAssembly;
  180. stream.Close();
  181. stream.Dispose();
  182. Type t = assembly.GetType(@namespace + "." + classname, true, true);
  183. object obj = Activator.CreateInstance(t);
  184. System.Reflection.MethodInfo mi = t.GetMethod(methodname);
  185. //cplist.ReferencedAssemblies.Clear();
  186. //double elapse = (DateTime.Now - dt).TotalMilliseconds;
  187. object objrst= mi.Invoke(obj, args);
  188. //Debug.WriteLine(elapse.ToString()+";"+objrst.ToString());
  189. return objrst;
  190. /*
  191. PropertyInfo propertyInfo = type.GetProperty(propertyname);
  192. return propertyInfo.GetValue(obj, null); */
  193. }
  194. catch (Exception ex)
  195. {
  196. throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
  197. }
  198. finally
  199. {
  200. }
  201. }
  202. private static string GetWsClassName(string wsUrl)
  203. {
  204. string[] parts = wsUrl.Split('/');
  205. string[] pps = parts[parts.Length - 1].Split('.');
  206. return pps[0];
  207. }
  208. #endregion
  209. //// XmlTextReader reader = new XmlTextReader(url + "?wsdl");
  210. //// //创建和格式化 WSDL 文档
  211. //// ServiceDescription sd = ServiceDescription.Read(reader);
  212. //// //创建客户端代理代理类
  213. //// ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  214. //// sdi.AddServiceDescription(sd, null, null);
  215. //// //使用 CodeDom 编译客户端代理类
  216. //// CodeNamespace cn = new CodeNamespace(_CODE_NAMESPACE);
  217. //// CodeCompileUnit ccu = new CodeCompileUnit();
  218. //// ccu.Namespaces.Add(cn);
  219. //// sdi.Import(cn, ccu);
  220. //// Microsoft.CSharp.CSharpCodeProvider icc = new Microsoft.CSharp.CSharpCodeProvider();
  221. //// CompilerParameters cp = new CompilerParameters();
  222. //// CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);
  223. //// _agentType = cr.CompiledAssembly.GetTypes()[0];
  224. //// _agent = Activator.CreateInstance(_agentType);
  225. ////}
  226. ///////<summary<
  227. ///////调用指定的方法
  228. ///////</summary<
  229. ///////<param name="methodName"<方法名,大小写敏感</param<
  230. ///////<param name="args"<参数,按照参数顺序赋值</param<
  231. ///////<returns<Web服务的返回值</returns<
  232. ////public object Invoke(string methodName, params object[] args)
  233. ////{
  234. //// MethodInfo mi = _agentType.GetMethod(methodName);
  235. //// return this.Invoke(mi, args);
  236. ////}
  237. ///////<summary<
  238. ///////调用指定方法
  239. ///////</summary<
  240. ///////<param name="method"<方法信息</param<
  241. ///////<param name="args"<参数,按照参数顺序赋值</param<
  242. ///////<returns<Web服务的返回值</returns<
  243. ////public object Invoke(MethodInfo method, params object[] args)
  244. ////{
  245. //// return method.Invoke(_agent, args);
  246. ////}
  247. ////public MethodInfo[] Methods
  248. ////{
  249. //// get
  250. //// {
  251. //// return _agentType.GetMethods();
  252. //// }
  253. }
  254. }