webservice动态加载

动态加载WebService

/// <summary>
        /// 动态获取webservice
        /// </summary>
        /// <param name="url">地址后缀加?WSDL</param>
        /// <param name="nspace">命名空间</param>
        /// <param name="functionName">接口名称</param>
        /// <param name="para">参数object[]</param>
        /// <returns></returns>
        public static string WebServiceDes(string url,string nspace, string functionName,object[] para=null)
        {
            WebClient web = new WebClient();
            Stream stream = web.OpenRead(url);
            ServiceDescription description = ServiceDescription.Read(stream);
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
            importer.ProtocolName = "Soap"; // 指定访问协议。
            importer.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;

            importer.AddServiceDescription(description, null, null); // 添加 WSDL 文档。

            // 4使用 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();
            parameter.GenerateExecutable = false;
            parameter.GenerateInMemory = true;
            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)
            {
                Assembly asm = result.CompiledAssembly;
                Type t = asm.GetType(nspace); // 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。

                object o = Activator.CreateInstance(t);
                MethodInfo method = t.GetMethod(functionName);
                try
                {
                    string jsonstr = method.Invoke(o, para).ToString();
                    return jsonstr;
                }
                catch (Exception)
                {

                    return "请检查接口是否正确!";
                }
                
                
            }
            else
            {
                return "请检查接口是否正确!";
            }
        }

 东西还是记录下来比较好,写过一次在想看要找好长时间。。

posted @ 2021-02-03 10:48  绯颜旧雨  阅读(133)  评论(0编辑  收藏  举报