加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

动态调用Webservice

发布时间:2020-12-17 01:26:42 所属栏目:安全 来源:网络整理
导读:??????? private object InvokeWebService(string url,string methodname,object[] args) ??????? { ??????????? return InvokeWebService(url,null,methodname,args); ??????? } ??????? private object InvokeWebService(string url,string classname,obje

??????? private object InvokeWebService(string url,string methodname,object[] args) ??????? { ??????????? return InvokeWebService(url,null,methodname,args); ??????? } ??????? private object InvokeWebService(string url,string classname,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,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); // 添加 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);??????????????? //类类型 ??????????????? 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);?? //类类型 ??????????????? 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]; ??????? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读