动态调用WebService
方案一:
优点:可以根据需求灵活调用Java或者.Net WebService;客户端调用WebService方法简单
缺点:每次我都要把想调用的函数的参数组织成一个object[]才行,且每次调用InvokeWebService都是在内存中创建动态程序集(代理),效率低。
InvokeWebService |
|
/// <summary> /// 获取WebService类型 20101223 /// </summary> /// <param name="wsUrl">WebService地址</param> /// <returns></returns> private static string GetWsClassName(string wsUrl) { string[] parts = wsUrl.Split('/'); string[] pps = parts[parts.Length - 1].Split('.');
return pps[0]; }
/// <summary> /// 调用WebService 20101223 /// </summary> /// <param name="wsUrl">WebService地址</param> /// <param name="methodName">方法名称</param> /// <param name="args">参数列表</param> /// <returns></returns> public static string InvokeWebService(string wsUrl,string methodName,object[] args) { return InvokeWebService(wsUrl,null,methodName,args); }
/// <summary> /// 调用WebService 20101223 /// </summary> /// <param name="wsUrl">WebService地址</param> /// <param name="className">类名</param> /// <param name="methodName">方法名称</param> /// <param name="args">参数列表</param> /// <returns></returns> public static string InvokeWebService(string wsUrl,string className,object[] args) { string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling"; if ((className == null) || (className == "")) { className = GetWsClassName(wsUrl); }
try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(wsUrl + "?wsdl"); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); //System.Web.Services.Description.serviced sdi.AddServiceDescription(sd,"",""); CodeNamespace cn = new CodeNamespace(@namespace);
CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn,ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler();
//设定编译参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll");
//编译代理类 CompilerResults cr = icc.CompileAssemblyFromDom(cplist,ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); }
System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + className,true,true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.getmethod(methodName);
return mi.Invoke(obj,args).ToString(); } catch (Exception ex) { throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace)); } } |
ArrayList parms = new ArrayList(); string reslut = ""; parms.Add(queryArea); parms.Add(sql_sbsjBegin); parms.Add(sql_sbsjEnd); parms.Add(sql_pageIndex); parms.Add(this.radioButton1.Checked); parms.Add(queryType); parms.Add(sqlstr); reslut=WIS_PUB_Class.Security.InvokeWebService(Const.getWebServiceConnetion("WisTable4"), "queryCommon",parms.ToArray()); DataSet rs = new DataSet(); rs = Tl.CXmlToDataSet(Security.Decrypt(reslut));// //1.解压缩解密 2. XML转换成DataSet |
方案二:
优点:不需要每一个方法生成代理类,提高调用webservice效率。
缺点:(无法使用该方法)因为每一个类需要创建一个DLL文件,添加DLL引用,但是添加Java和.Net DLL引用别名不一样。
创建DLL文件 |
CreateWebServiceDLL |
public static void CreateWebServiceDLL(string url) { string @namespace = "ServiceBase.WebService.DynamicWebLoad"; string classname = WebServiceHelper.GetClassName(url);
WebClient web = new WebClient(); Stream stream = web.OpenRead(url + "?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); // 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.OutputAssembly = "e://Wistable4.dll"; 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 (result.Errors.HasErrors) { System.Text.StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in result.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } } |
CreateWebServiceDLL |
|
public static object GetWebServiceInstance(string url) { string @namespace = "ServiceBase.WebService.DynamicWebLoad"; string classname = WebServiceHelper.GetClassName(url); WebClient web = new WebClient(); Stream stream = web.OpenRead(url + "?WSDL"); 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); 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.OutputAssembly = "e://Wistable4.dll"; // 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 (result.Errors.HasErrors) { System.Text.StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in result.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("Wistable4");//Load("e://WisTable1"); Type t = assembly.GetType(@namespace + "." + classname,true); object obj = Activator.CreateInstance(t); return obj; } private static string GetClassName(string url) { string[] parts = url.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0]; }
|
CreateWebServiceDLL |
|
//声明全局的变量 public static ServiceBase.WebService.DynamicWebLoad.WISTABLE4_WS wistable4;//.NET 变量 //public static ServiceBase.WebService.DynamicWebLoad.Wistable4 wistable4;//.Java 变量 //声明变量Java和.net不一致,所以导致无法使用该方法。
object o = WebServiceHelper.GetWebServiceInstance(Const. getWebServiceConnetion(“Wistable4”));/ //获取服务器连接 wistable4 = o as ServiceBase.WebService.DynamicWebLoad.WISTABLE4_WS; string dt = wistable4.queryByInfoID("1234567");//传入参数并且调用方法返回值 Console.WriteLine(dt); Console.ReadLine();
|
方案三:
优点:通过HttpWebRequest 请求获取WSDL文件。不需要每一个方法创建代理类
缺点:每一次都要去获取该方法的WSDL的XML文件,并且返回XML文件,再针对返回的XML文件解析。
|
|
private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName) { XmlDocument doc = new XmlDocument(); doc.LoadXml(@"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""></soap:Envelope>"); AddDelaration(doc); XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/"); XmlElement soapMethod = doc.CreateElement(MethodName); soapMethod.SetAttribute("xmlns", XmlNs); foreach (string k in Pars.Keys) { XmlElement soapPar = doc.CreateElement(k); soapPar.InnerText = Pars[k].ToString(); soapMethod.AppendChild(soapPar); } soapBody.AppendChild(soapMethod); doc.DocumentElement.AppendChild(soapBody); return Encoding.UTF8.GetBytes(doc.OuterXml); } |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。