WebService传输DataSet的

来源:互联网 发布:mysql主从复制ssl 编辑:程序博客网 时间:2024/05/03 08:56

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怎么传输,在Paain上看到Tomgus (小桥流水) 老兄转载的http://www.cnblogs.com/flyskywlh/archive/2005/08/18/217382.html,乃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端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且我觉得“双代理”还可以为我们处理其他很多的问题,比如排队,异 步操作,权限等等。那位朋友||大拿||高人有兴趣探讨这个问题的,小可甚喜!