动态调用webservice方案
2010-12-28 09:36
323 查看
动态调用WebService
方案一:
优点:可以根据需求灵活调用Java或者.Net WebService;客户端调用WebService方法简单缺点:每次我都要把想调用的函数的参数组织成一个object[]才行,且每次调用InvokeWebService都是在内存中创建动态程序集(代理),效率低。
调用WebService方法 | 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, string methodName, 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)); } } |
客户端调用WebService方法 | 客户端调用WisTable4.queryCommon方法 |
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, 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()); } } |
调用WebService方法 | 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, 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, 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]; } |
客户端 调用WebService方法 | 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); } |
相关文章推荐
- 转载:动态调用WebService(C#)
- Silverlight 动态调用 WebService
- 转载:动态调用WebService(C#)
- C#动态调用webservice的方法
- .Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#)
- C#动态调用webservice
- C# 动态调用webservice
- 动态调用WebService,首先声明:这篇文章是我从网上学习来的,根据自己实际的情况写的,只给自己看的!
- .Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#)
- 动态调用Webservice
- 动态调用WebService以及传递复杂对象
- 动态调用 WebService
- Java动态调用Webservice
- 中心点通过url来动态调用 周边点不同位置但功能相同的WebService
- .动态调用WebService(C#)
- WEBService动态调用代码
- 动态调用WebService解决方案
- 动态调用Webservice
- java AXIS2动态调用WCF webservice
- C#修改config文件实现动态调用webservice实现问题