首页 > 其他分享 >WebService传输DataSet的一点想法和实践-.NET教程,Web Service开发

WebService传输DataSet的一点想法和实践-.NET教程,Web Service开发

时间:2022-11-27 11:34:57浏览次数:41  
标签:Web WebService Service ds ms using new dataset sharpziplib


其实这个标题很大,实现起来也可以有许多的办法。甚至,应否这样做也许都能惹出许多的争论(比如,为什么用ws而不是remoting? 为什么传dataset而不是entity[]?)。

       由于ds的体态丰腴,选用何种序列化就很多的选择了,我尝试过如下方法:

      1,    soapfomatter

       2, binaryfomatter 

  3,soapfomatter + sharpziplib

  4,binaryfomatter + sharpziplib

  5, datasetsurrogate (http://support.microsoft.com/default.aspx?scid=kb;en-us;829740)

  6, datasetsurrogate + sharpziplib

  7, pab.compressdataset.wrapper (http://www.eggheadcafe.com/articles/20031219.asp)

若论压缩效果,第7种办法是最优秀的,第2名是第6种办法。

若论速度,第7种和第6种几乎差不多。。。(最快的好像是第2种)

(区区年前曾做了一个详细的工程,分别用100/1000/10000条纪录对上述方法进行测试,然该工程很可能丢到抓娃国了,故详细数据暂且欠奉,待找回后当补充之)

pab.compressdataset.wrapper 据上文所说,乃是通过反向工程.net compact framework而得到的压缩代码,我估计它也采用了类似于datasetsurrogate那样的替代对象来存储。本来我是很倾向使用这个方法的,可惜这个咚咚没有源码(且dll加了混淆)。。。而反观第6种,我们则可以轻松坐拥全部源码,所以最后我还是选择了第6种办法的。下面的一点代码,可供各位晒笑:

using system;
using system.io;
using system.runtime.serialization.formatters.binary;
using system.xml.serialization;
using system.data;
using icsharpcode.sharpziplib.checksums;
using icsharpcode.sharpziplib.zip;
using icsharpcode.sharpziplib.gzip;

/// <summary>
  /// 压缩数据集
  /// </summary>
  /// <param name="ds"></param>
  /// <returns></returns>
  public static byte[] compressds(dataset ds)
  {
   memorystream ms = new memorystream();
   zipoutputstream zos = new zipoutputstream(ms);
   zos.putnextentry(new zipentry(ds.datasetname));   
   binaryformatter bf = new binaryformatter();
   datasetsurrogate dss = new datasetsurrogate(ds);
   bf.serialize(zos, dss);
   zos.closeentry();
   zos.close();
   byte[] ret = ms.toarray();   
   ms.close();
   return ret;
  }

  /// <summary>
  /// 解压数据集
  /// </summary>
  /// <param name="byt"></param>
  /// <returns></returns>
  public static dataset decompressds(byte[] byt)
  {
   memorystream ms = new memorystream(byt);
   binaryformatter bf = new binaryformatter();
   zipinputstream zis = new zipinputstream(ms);
   zis.getnextentry();   
   datasetsurrogate dss = (datasetsurrogate)bf.deserialize(zis);
   zis.close();
   ms.close();
   dataset ds = dss.converttodataset();
   return ds; 
  } 

基于sharpziplib实现上面两个函数后,ds压缩的任务就完成了。btw,vs2005里边,.net fw 自带了compressstream,我们可以跟sharpziplib说再见了:)

至于ws怎么传输,在上看到tomgus (小桥流水) 老兄转载的乃flyskywlh老兄的大作。

     首先我也很同意使用byte[]数组传输,非常方便。至于具体webmethod的方式,我在实际应用中是大量使用实体webmthod的,比如:

[webmethod]

public dataset getorders() {};    //获取所有订单

[webmethod]

public dataset updateorders(dataset dsorders){};     //更新指定订单

因为采取这种模式,所以系统里边有极多的webmethod(winformui仅通过ws交互),一个标准wm的调用流程是:

客户端压缩wm中所有ds型的参数-〉调用wm-〉服务器端解压所有ds型的参数-〉执行实际wm-〉对ds型的返回值进行压缩-〉客户端接收并解压得出结果ds

上述流程的具体实现很麻烦,在客户端用了aop的透明代理的概念;服务器端则用了动态调用ws的技术。实现这种“双代理”的模式后,对于ws端或winform端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且我觉得“双代理”还可以为我们处理其他很多的问题,比如排队,异步操作,权限等等。那位朋友||大拿||高人有兴趣探讨这个问题的,小可甚喜!



标签:Web,WebService,Service,ds,ms,using,new,dataset,sharpziplib
From: https://blog.51cto.com/u_15834343/5889900

相关文章

  • Failed to start mysqld.service: Unit not found
    转载自:https://blog.csdn.net/miaodichiyou/article/details/99289160 ========================= 很多人对本博客的方法提出了质疑,在此我解释一下:由于MySQL在CentO......
  • webpack配置css文件
    1.webpack处理js文件webpack会自动处理js文件和js文件之间的依赖。配置webpack.config.js文件,就可以在运行的时候使用webpack来代替webpack'./src/ma......
  • System.Net.Mail和System.Web.Mail
    System.Net.Mail是作为System.Web.Mail的替代来发送EMAIL. 1)System.Net.Mailprivate void SendMailByNet(){    MailMessage objMailMessage =......
  • Web安全基础 - RCE CTFHub
    Web安全基础-RCECTFhub题目来自CTFHub,Web方向技能树Rce部分https://www.ctfhub.com/#/skilltree基本介绍远程命令/代码执行漏洞,简称RCE漏洞,可以让攻击者直接向后台服......
  • Web安全基础 - LFI Labs
    Web安全基础-LFILabs本实验来自于https://github.com/paralax/lfi-labs做到一半了才发现BUUCTF上有,可以参考本篇做一下更有成就感CMDCMD-1该关卡直接执行Get方法cm......
  • canvas绘制手写签名【移动端+web】--支持下载
    一个简单的实例<head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-widt......
  • web系统添加盲水印
    前言为增加系统安全性,避免重要敏感信息通过截图方式泄露,对web页面增加盲水印标识,标注系统名称,登陆人,当前时间等信息,这里的盲水印指肉眼不可见的html水印增加水印引入wate......
  • webpack打包ts代码
    webpack通常情况下,实际开发中我们都需要使用构建工具对代码进行打包,TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS。步骤:初始化项......
  • web系统添加盲水印
    前言为增加系统安全性,避免重要敏感信息通过截图方式泄露,对web页面增加盲水印标识,标注系统名称,登陆人,当前时间等信息,这里的盲水印指肉眼不可见的html水印增加水印引入wat......
  • webpack打包工具-基本配置
    /**@Author:[email protected]*@Date:2022-11-2517:42:05*@LastEditors:[email protected]*@LastEditTime:2022-11-2617......