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

  • 相关阅读:
    提示“此Flash Player与您的地区不相容,请重新安装Flash”的解决办法
    python中安装并使用redis
    linux安装flash player来播放视频
    安装redis
    centos6.5安装无线网卡驱动并配置wifi
    centos安装java的jdk
    001-python简介
    源码
    进程间通信之综述
    图的概念
  • 原文地址:https://www.cnblogs.com/mingle/p/1555128.html
Copyright © 2011-2022 走看看