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

WebService传输DataSet的

发布时间:2020-12-17 02:53:40 所属栏目:安全 来源:网络整理
导读: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.SharpZipL

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端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且我觉得“双代理”还可以为我们处理其他很多的问题,比如排队,异 步操作,权限等等。那位朋友||大拿||高人有兴趣探讨这个问题的,小可甚喜!

?

(编辑:李大同)

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

    推荐文章
      热点阅读