zoukankan      html  css  js  c++  java
  • 动态编译webservice的方法

    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

  • 相关阅读:
    放一个Dynamicinputs corresponding to Dynamicknobs的Node源码
    NDK学习笔记(四):OutputContext机制
    NDK学习笔记(三):DynamicKnobs的机制
    OpenEXR的采样机制
    OpenEXR的读取机制
    OpenEXR的输出机制
    虚拟机中安装centOS及破解nuke的方法
    OpenEXR-2.2.0在Win7 x64系统下的安装方法
    NDK学习笔记(二)
    NDK学习笔记(Add.cpp注释)(一)
  • 原文地址:https://www.cnblogs.com/mingle/p/1555128.html
Copyright © 2011-2022 走看看