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

动态调用webservice方案

发布时间:2020-12-17 01:23:16 所属栏目:安全 来源:网络整理
导读:动态调用 WebService 方案一: 优点:可以根据需求灵活调用 Java 或者 .Net WebService ;客户端调用 WebService 方法简单 缺点:每次我都要把想调用的函数的参数组织成一个 object[] 才行,且每次调用 InvokeWebService 都是在内存中创建动态程序集(代理)

动态调用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,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); //

??????????? 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);

??????????? 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];

??????? }

?

?

客户端 调用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文件。不需要每一个方法创建代理类

缺点:每一次都要去获取该方法的WSDLXML文件,并且返回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);????????}

(编辑:李大同)

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

    推荐文章
      热点阅读