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(Con@R_404[email protected]["UseProxy"]); if (useProxy) { WebProxy proxy = null; string proxyAddressAndPort = Con@R_404[email protected]["Proxy"]; string proxyUserName = Con@R_404[email protected]["ProxyUserName"]; string proxyPassword = Con@R_404[email protected]["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]; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。