藉由GZipStream的壓縮,來減少Web Service的傳輸量

1. 壓縮+Serialize

Web Service Side :

using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;



[WebMethod]
public byte[] getZipData()
{
    DataSet ds = LoadData().Copy();
    ds.RemotingFormat = SerializationFormat.Binary;
    BinaryFormatter ser = new BinaryFormatter();
    MemoryStream unMS = new MemoryStream();
    ser.Serialize(unMS, ds);

    byte[] bytes = unMS.ToArray();
    int lenbyte = bytes.Length; 

    MemoryStream compMs = new MemoryStream();
    GZipStream compStream = new GZipStream(compMs, CompressionMode.Compress, true);
    compStream.Write(bytes, 0, lenbyte); 

    compStream.Close();
    unMS.Close();
    compMs.Close();
    byte[] zipData = compMs.ToArray();
    return zipData; 
}

private DataSet LoadData()
{//產生測試資料用
    DataSet ds = new DataSet();
    DataTable dt = new DataTable("Test");
    dt.Columns.Add("ProID",typeof(int));
    dt.Columns.Add("ProName", typeof(string));
    dt.Columns.Add("CreateTime", typeof(DateTime));
    dt.Columns["ProID"].AutoIncrement = true;
    for (int i = 0; i < 100000; i++)
    {
        DataRow dr = dt.NewRow();
        dr["ProName"] = Guid.NewGuid().ToString();
        dr["CreateTime"] = DateTime.Now.ToString();
        dt.Rows.Add(dr);
    }
    ds.Tables.Add(dt);
    ds.AcceptChanges();
    return ds;
}

 

 

 

 

Client Side :

using System.IO.Compression;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;



private void btn_ZipGet_Click(object sender, EventArgs e)
{
    try
    {
        WS.Service1 wss = new WSZipDemo.WS.Service1();//WebReference
        byte[] da = wss.getZipData(); 

        MemoryStream input = new MemoryStream();
        input.Write(da, 0, da.Length);
        input.Position = 0;
        GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true); 

        MemoryStream output = new MemoryStream();
        byte[] buff = new byte[4096];
        int read = -1;
        read = gzip.Read(buff, 0, buff.Length);
        while (read > 0)
        {
            output.Write(buff, 0, read);
            read = gzip.Read(buff, 0, buff.Length);
        }
        gzip.Close();
        byte[] rebytes = output.ToArray();
        output.Close();
        input.Close(); 

        MemoryStream ms = new MemoryStream(rebytes);
        BinaryFormatter bf = new BinaryFormatter();
        object obj = bf.Deserialize(ms);
        DataSet ds = (DataSet)obj;
        dataGridView1.DataSource = ds.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值