c# 动态调用wsdl接口

调用?wsdl 的接口,可以在项目中添加服务引用,或者使用动态调用的方式。在开发环境中不能访问到接口地址时,就需要使用动态调用,

动态编译后,使用反射调用接口中的方法,完成接口的调用。

 

 1从目标 URL 下载 WSDL 数据;
 2使用 ServiceDescription 创建和格式化 WSDL 文档文件;
 3使用 ServiceDescriptionImporter 创建客户端代理类;
 4使用 CodeDom 动态创建客户端代理类程序集;
 5利用反射调用相关 WebService 方法。

public class WSHelper
    {
        /// <summary>
        /// 输出的dll文件名称
        /// </summary>
        private static string m_OutputDllFilename;

        /// <summary>
        /// WebService代理类名称
        /// </summary>
        private static string m_ProxyClassName;

        /// <summary>
        /// WebService代理类实例
        /// </summary>
        private static object m_ObjInvoke;

        /// <summary>
        /// 接口方法字典
        /// </summary>
        private static Dictionary<EMethod, MethodInfo> m_MethodDic = new Dictionary<EMethod, MethodInfo>();

        /// <summary>
        /// 创建WebService,生成客户端代理程序集文件
        /// </summary>
        /// <param name="error"></param>
        /// <returns></returns>
        public static bool CreateWebService(out string error)
        {
            try
            {
                error = string.Empty;
                m_OutputDllFilename = ConfigurationManager.AppSettings[""].ToString();
                m_ProxyClassName = ConfigurationManager.AppSettings[""].ToString();
                string webServiceUrl = ConfigurationManager.AppSettings[""].ToString();
                webServiceUrl += "?WSDL";

                // 如果程序集已存在,直接使用
                if (File.Exists(Path.Combine(Environment.CurrentDirectory, m_OutputDllFilename)))
                {
                    BuildMethods();
                    return true;
                }
                //使用 WebClient 下载 WSDL 信息。
                WebClient web = new WebClient();
                Stream stream = web.OpenRead(webServiceUrl);
                //创建和格式化 WSDL 文档。
                if (stream != null)
                {
                    // 格式化WSDL
                    ServiceDescription description = ServiceDescription.Read(stream);
                    // 创建客户端代理类。
                    ServiceDescriptionImporter importer = new ServiceDescriptionImporter
                    {
                        ProtocolName = "Soap",
                        Style = ServiceDescriptionImportStyle.Client,
                        CodeGenerationOptions =
                            CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync
                    };
                    // 添加 WSDL 文档。
                    importer.AddServiceDescription(description, null, null);
                    //使用 CodeDom 编译客户端代理类。
                    CodeNamespace nmspace = new CodeNamespace();
                    CodeCompileUnit unit = new CodeCompileUnit();
                    unit.Namespaces.Add(nmspace);
                    ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                    CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                    CompilerParameters parameter = new CompilerParameters
                    {
                        GenerateExecutable = false,
                        // 指定输出dll文件名。
                        OutputAssembly = m_OutputDllFilename
                    };
                    parameter.ReferencedAssemblies.Add("System.dll");
                    parameter.ReferencedAssemblies.Add("System.XML.dll");
                    parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                    parameter.ReferencedAssemblies.Add("System.Data.dll");
                    // 编译输出程序集
                    CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                    // 使用 Reflection 调用 WebService。
                    if (!result.Errors.HasErrors)
                    {
                        BuildMethods();
                        return true;
                    }
                    else
                    {
                        error = "反射生成dll文件时异常";
                    }
                    stream.Close();
                    stream.Dispose();
                }
                else
                    error = "打开WebServiceUrl失败";
            }
            catch (Exception ex)
            {
                error = ex.Message;
                //Log.WriteLog(error);
            }
            return false;
        }

        /// <summary>
        /// 反射构建Methods
        /// </summary>
        private static void BuildMethods()
        {
            Assembly asm = Assembly.LoadFrom(m_OutputDllFilename);
            Type[] types = asm.GetTypes();
            Type asmType = asm.GetType(m_ProxyClassName);
            m_ObjInvoke = Activator.CreateInstance(asmType);
            var methods = Enum.GetNames(typeof(EMethod)).ToList();
            foreach (var item in methods)
            {
                var methodInfo = asmType.GetMethod(item);
                if (methodInfo != null)
                {
                    var method = (EMethod)Enum.Parse(typeof(EMethod), item);
                    m_MethodDic.Add(method, methodInfo);
                }
            }
        }
        /// <summary>
        /// 获取请求响应
        /// </summary>
        /// <param name="method"></param>
        /// <param name="para"></param>
        /// <returns></returns>
        public static string GetResponseString(EMethod method, params object[] para)
        {
            string result = string.Empty;
            try
            {
                if (m_MethodDic.ContainsKey(method))
                {
                    var temp = m_MethodDic[method].Invoke(m_ObjInvoke, para);
                    if (temp != null)
                        result = temp.ToString();
                }
            }
            catch { }
            return result;
        }
    }
//接口的方法名称 
public
enum EMethod { method1, method2, method3 }

调用:


string error="";
string param1 = "";
string param2 = "";
string param3 = "";
bool succ = WSHelper.CreateWebService(out error);
string result = WSHelper.GetResponseString(EMethod.method1, param1,param2,param3);

 

posted @ 2019-12-15 17:57  陈鹏昱Chen  阅读(2058)  评论(0)    收藏  举报