web Service dataset压缩传输

服务端:

using System;

using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
using System.Data;using CompressDataSet;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
    public klmywgSoapHeader header = new klmywgSoapHeader();
    public Service () {

        //如果使用设计的组件,请取消注释以下行
        //InitializeComponent();
    }

    [WebMethod]
    [SoapHeader("header")]
    public string HelloWorld() {
       string result= header.Validate();
       if (result == "true")
       {
           return "Hello World";
       }
       else
           return result;
    }
    private DataSet GetDataSet()
    {
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        ds.Tables.Add(dt);
        dt.Columns.Add("UserName", typeof(string));
        DataRow dr = dt.NewRow();
        dr["UserName"] = "UserName";
        dt.Rows.Add(dr);
        return ds;
    }

    [WebMethod(Description = "直接返回DataSetSurrogate对象,并用Binary序列化后并且ZIP压缩的字节数组")]
    public byte[] GetDataSetSurrogateZipBytes()
    {
        DataSet ds = GetDataSet();
        DataSetSurrogate dss = new DataSetSurrogate(ds);
        BinaryFormatter ser = new BinaryFormatter();  //序列化对象
        MemoryStream ms = new MemoryStream();  //内存流
        ser.Serialize(ms, dss);
        byte[] buffer = ms.ToArray();    //字节流
        byte[] bufferZip = ComPress(buffer);
        return bufferZip ; } //压缩方法 

 public byte[] ComPress(byte[] data) { try { MemoryStream ms = new MemoryStream(); Stream zipStream = null; zipStream = new GZipStream(ms, CompressionMode.Compress, true); zipStream.Write(data, 0, data.Length); zipStream.Close(); ms.Position = 0; byte[] compressed_data = new byte[ms.Length]; ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString())); return compressed_data; } catch { return null; } } }

客户端:

using System.IO;
using System.IO.Compression;

       byte[] zipBuffer = service.GetDataSetSurrogateZipBytes();
        byte[] buffer = UnZipClass.Decompress(zipBuffer);
        BinaryFormatter ser = new BinaryFormatter();
        DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
        DataSet dataSet = dss.ConvertToDataSet();  

解压:UnZipClass.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;

public static class UnZipClass
{
    public static byte[] Decompress(byte[] data)
    {
        try
        {
            MemoryStream ms = new MemoryStream(data);
            Stream zipStream = null;
            zipStream = new GZipStream(ms, CompressionMode.Decompress);
            byte[] dc_data = null;
            dc_data = ExtractBytesFromStream(zipStream, data.Length);
            return dc_data;
        }
        catch
        {
            return null;
        }
    }
    public static byte[] ExtractBytesFromStream(Stream zipStream, int dataBlock)
    {
        byte[] data = null;
        int totalBytesRead = 0;
        try
        {
            while (true)
            {
                Array.Resize(ref data, totalBytesRead + dataBlock + 1);
                int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
                if (bytesRead == 0)
                {
                    break;
                }
                totalBytesRead += bytesRead;
            }
            Array.Resize(ref data, totalBytesRead);
            return data;
        }
        catch
        {
            return null;
        }
    }
}
时间: 2024-10-08 16:20:33

web Service dataset压缩传输的相关文章

Web Service概念梳理

计算机技术难理解的很多,Web Service 对我来说就是一个很难理解的概念:为了弄清它到底是什么,我花费了两周的时间,总算有了一些收获,参考了不少网上的资料,但有些概念说法不一.我以w3c和 一些早期介绍Web Service的书为准.如有错误,欢迎指正! -------------------------------------------------------------- 提前预警!概念太多,你需要仔细阅读,或要阅读两遍.   SOA                        

从WEB SERVICE 上返回大数据量的DATASET

原文链接:http://www.cnblogs.com/flyskywlh/archive/2005/08/18/217382.html 前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作.查遍了网站的文章,问了一些朋友,也找了一些解决方法.        众所周知,如果不用其它方法,直接从WEB SERVICE上传回一个10W条记录的DATASET,可想而知的后果是什么,

Web Service 中返回DataSet结果的几种方法

Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象    特点:通常组件化的处理机制,不加任何修饰及处理:    优点:代码精减.易于处理,小数据量处理较快:    缺点:大数据量的传递处理慢,消耗网络资源:    建议:当应用系统在内网.专网(局域网)的应用时,或外网(广域网)且数据量在KB级时的应用时,采用此种模式. 2)返回DataSet对象用Binary序列化后的字节数组    特点:字节数组流的处理模式:    优点:易于处理,可以中文内容起到

.Net 1.X平台的Web Service (WS) 数据流压缩方案

由于目前有些平台仍是在.Net 1.X上面,虽然GZipStream可以压缩数据流,但它必需在.Net 2.0以上的平台才能用,但也不代表.Net 1.X就只能乖乖的认命,接受这个结果,其实在.Net 1.X上,也有一个方法可以做到数据流的压缩,微软有提供一个对象DataSetSurrogate来协助开发人员不用花太多的时间在Coding上,就可以达成目标. 仔细去看DataSetSurrogate的源代码后,大至上就可以了解到它是怎么去"简化"数据量,怎么运用多个Array List

Web Service 那点事儿(1)

Web Service,即“Web 服务”,简写为 WS,从字面上理解,它其实就是“基于 Web 的服务”.而服务却是双方的,有服务需求方,就有服务提供方.服务提供方对外发布服务,服务需求方调用服务提供方所发布的服务.其实也就是这些了,没有多少高大上的东西. 本文将从实战的角度,描述使用 Java 开发 WS 的工具及其使用过程. 如果说得再专业一点,WS 其实就是建立在 HTTP 协议上实现异构系统通讯的工具.没错!WS 说白了还是基于 HTTP 协议的,也就是说,数据是通过 HTTP 进行传

asp.net zip 压缩传输

在实际生产中,比如使用xml json 等传输大量数据的时候,有时候会出现等待时间过长,这里分享一个压缩传输的方法 首先到网上去下载一个 ICSharpCode.SharpZipLib.dll 的dll (百度和google)都是可以搜索到的 这里本人是在传输xml 格式文本的时候感觉网速稍慢,所以找到了此优化的方法 这里把代码分享出来 这里是压缩数据的方法 using System; using System.Collections.Generic; using System.Web; usi

构建安全的Xml Web Service系列之SSL篇

原文:构建安全的Xml Web Service系列之SSL篇 首先介绍一下SSL, SSL 的英文全称是 "Secure Sockets Layer" ,中文名为 "安全套接层协议层 ",它是网景( Netscape )公司提出的基于 WEB 应用的安全协议.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装.压缩.加密等基本功能的支持.SSL是Security Socke

Web Service 小练习

对于网站与网站之间数据互动,这是我的说法,不是专家说的,不要相信.应该有专业的说法. 从他人的网站通过一个接口获取数据,这一直是我感到神奇的事,怎么实现的,一直萦绕于心,想要弄过究竟,怎么是实现的啊!不止一次在群里听到同样的提问.可惜每次我都没有深入探究,自己太懒惰了,不想动手实践,想找现成的,可惜也没有去找. 还是要工作压力驱使,不然也许这个一直对我来说是一个疑惑.工作中有这么一个任务就是通过接口去获取供应商的数据,还好已经有现成的了,我只要看懂,然后模仿做一个就可以了,不过也费了我不少时间.

java面试题全集(中)--Java Web和Web Service相关面试题

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程