动态调用Webservice

        private object InvokeWebService(string url, string methodname, object[] args)
        {
            return InvokeWebService(url, null, methodname, args);
        }

        private object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = GetWsClassName(url);
            }

            try
            {
                // 1. 使用 WebClient 下载 WSDL 信息。
                WebClient wClient = new WebClient();

                // 设置代理服务器
                bool useProxy = Convert.ToBoolean(ConfigurationManager.AppSettings["UseProxy"]);
                if (useProxy)
                {
                    WebProxy proxy = null;
                    string proxyAddressAndPort = ConfigurationManager.AppSettings["Proxy"];
                    string proxyUserName = ConfigurationManager.AppSettings["ProxyUserName"];
                    string proxyPassword = ConfigurationManager.AppSettings["ProxyPassword"];
                    ICredentials cred;
                    cred = new NetworkCredential(proxyUserName, proxyPassword);
                    proxy = new WebProxy(proxyAddressAndPort, true, null, cred);
                    WebRequest.DefaultWebProxy = proxy;
                    wClient.Proxy = proxy;
                }

                Stream stream = wClient.OpenRead(url + "?WSDL");

                // 2. 创建和格式化 WSDL 文档。
                ServiceDescription description = ServiceDescription.Read(stream);

                // 3. 创建客户端代理代理类。
                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(@namespace); // 为代理类添加命名空间,缺省为全局空间。
                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);
                //编译器结果
                if (true == result.Errors.HasErrors)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in result.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    throw new Exception(sb.ToString());
                }

                // 5. 使用 Reflection 调用 WebService。
                System.Reflection.Assembly assembly = result.CompiledAssembly;                      //经过编译了的程序集类
                Type t = assembly.GetType(@namespace + "." + classname, true, true);                //类类型
                object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi = t.GetMethod(methodname);                          //方法类型
                System.Reflection.PropertyInfo pi = t.GetProperty("XXXHeaderValue");          //属性类型

                System.Reflection.Assembly assembly1 = result.CompiledAssembly;                     //经过编译了的程序集类
                Type t1 = assembly1.GetType(@namespace + "." + classname + "Header", true, true);   //类类型
                object obj1 = Activator.CreateInstance(t1);

                System.Reflection.PropertyInfo piUsername = t1.GetProperty("Username");             //属性类型
                System.Reflection.PropertyInfo piPassword = t1.GetProperty("Password");             //属性类型

                piUsername.SetValue(obj1, "broze", null);
                piPassword.SetValue(obj1, "jiba", null);
                pi.SetValue(obj, obj1, null);

                return mi.Invoke(obj, args);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }

        private string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');
            return pps[0];
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值