技术开发 频道

Web Service传输DataSet的想法和实践

【IT168 技术文档】

  其实这个标题很大,实现起来也可以有许多的办法。由于DataSet的体态丰腴,选用何种序列化就很多的选择了,可以尝试如下方法:
(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

  PAB.CompressDataSet.Wrapper是通过反向工程.NET Compact Framework而得到的压缩代码,它也采用了类似于DataSetSurrogate那样的替代对象来存储。在这里,我们选择第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压缩的任务就完成了。VS.NET 2005里面,.NET Frameworks 自带了CompressStream,我们可以跟SharpZipLib说再见了。

  至于Web Services传输,我们可以使用byte[]数组传输,非常方便。至于具体WebMethod的方式,我在实际应用中是大量使用实体WebMthod的,比如:

[WebMethod]

public DataSet GetOrders() {};    //获取所有订单

[WebMethod]

public DataSet UpdateOrders(DataSet dsOrders){};     //更新指定订单

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

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

  上述流程的具体实现很麻烦,在客户端用了AOP的透明代理的概念;服务器端则用了动态调用WS的技术。实现这种“双代理”的模式后,对于WS端或Winform端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且,“双代理”还可以为我们处理其他很多的问题,比如排队,异步操作,权限等等。

0
相关文章