WCF大数据量传输解决方案

文章内容列表:
1. 场景:
2. 解决方案
3. WCF契约与服务实现设计静态图
4. WCF契约与服务实现设计详细说明
6. 服务端启动服务代码:
7. 客户端代码
8.   WCF大数据量传输解决方案源码下载

1. 场景:

WCF在网络传输中,大数据量传输造成网络阻塞,宽带无法承受;

2. 解决方案

解决WCF在网络传输中的大数据量问题:

A.需要把相关数据序列化成字节流,再对字节流进行压缩,再进行传输,到了客户端再做反向操作便可获得原始数据。

B.如果压缩后的数据仍然较大时,可以再压缩流后,再对流进行拆分即可。

                   (解决方案A图)

                     (解决方案2)

3. WCF契约与服务实现设计静态图

4. WCF契约与服务实现设计详细说明

契约接口详细说明

服务类详细说明

5. WCF契约与服务代码实现:
  契约代码


 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Runtime.Serialization;
 5using System.ServiceModel;
 6using System.Text;
 7///日期:2008-04-16
 8///作者:旋风
 9///来自:http://cnblogs.com/xuanfeng
10namespace WCFDataTransfers
11{
12
13    [ServiceContract(Namespace = "http://DataTransfers/Demao")]
14    public interface IDataTransfers
15    {  
16        /// <summary>
17        /// 获取所用压缩后字节流
18        /// </summary>
19        /// <returns></returns>
20        [OperationContract]
21        byte[] GetAllBuffer();
22        /// <summary>
23        /// 设置压缩后字节流分块,每一块的大小
24        /// </summary>
25        /// <param name="length"></param>
26        [OperationContract]
27        void SetBufferLength(int length);
28        /// <summary>
29        /// 读取压缩后字节流一块,并提升字节流的位置
30        /// </summary>
31        /// <returns></returns>
32        [OperationContract]
33        bool ReadNextBuffer();
34        /// <summary>
35        /// 获取当前块的字节流
36        /// </summary>
37        /// <returns></returns>
38        [OperationContract]
39        byte[] GetCurrentBuffer();       
40
41       
42    }
43
44   
45}
46

实现契约服务代码


  1using System;
  2using System.Data;
  3using System.Runtime.Serialization;
  4using System.Runtime.Serialization.Formatters.Binary;
  5using System.IO;
  6using System.IO.Compression;
  7using System.Collections.Generic;
  8using System.Linq;
  9using System.ServiceModel;
 10using System.Text;
 11///日期:2008-04-16
 12///作者:旋风
 13///来自:http://cnblogs.com/xuanfeng
 14namespace WCFDataTransfers
 15{
 16    
 17    public class DataTransfers :IDataTransfers
 18    {
 19        /// <summary>
 20        /// 无参数构造函数
 21        /// </summary>
 22        public DataTransfers()
 23        {
 24
 25            InitBuffers(InitTestDataSet());
 26        }
 27
 28        private byte[] buffer_all = null;
 29        private byte[] buffer_currect = null;
 30        private int  get_buffer_length = 1000;
 31        private long  remain_length;
 32        private MemoryStream stream;
 33        /// <summary>
 34        /// 生成一个测试的数据集
 35        /// </summary>
 36        /// <returns></returns>
 37        private DataSet InitTestDataSet()
 38        {
 39            DataSet ds = new DataSet("test");
 40            DataTable table = new DataTable("test");
 41            DataColumn column = new DataColumn("test");
 42            column.DataType = Type.GetType("System.String");
 43            table.Columns.Add(column);
 44            DataRow row;
 45            for (int i = 0; i < 100000;i++ )
 46            {
 47                row = table.NewRow();
 48                row["test"] = "测试数据 !";
 49                table.Rows.Add(row);
 50            }
 51
 52            ds.Tables.Add(table);
 53
 54            return ds;
 55        
 56        }
 57        /// <summary>
 58        /// 初始化压缩字节流
 59        /// </summary>
 60        /// <param name="ds"></param>
 61        private void InitBuffers(DataSet ds)
 62        {
 63            
 64                IFormatter formatter = new BinaryFormatter();
 65                MemoryStream stream_ = new MemoryStream();
 66                formatter.Serialize(stream_, ds);
 67                buffer_all = stream_.ToArray();
 68                stream_.Close();
 69                byte[] bytes_c = Compression(buffer_all, CompressionMode.Compress);
 70                stream = new MemoryStream(bytes_c);
 71                stream.Position = 0;
 72                remain_length = stream.Length;
 73
 74            
 75        }
 76        /// <summary>
 77        /// 提供内部使用压缩字流的方法
 78        /// </summary>
 79        /// <param name="data"></param>
 80        /// <param name="mode"></param>
 81        /// <returns></returns>
 82        private  byte[] Compression(byte[] data, CompressionMode mode)
 83        {
 84            DeflateStream zip = null;
 85            try
 86            {
 87                if (mode == CompressionMode.Compress)
 88                {
 89                    MemoryStream ms = new MemoryStream();
 90                    zip = new DeflateStream(ms, mode, true);
 91                    zip.Write(data, 0, data.Length);
 92                    zip.Close();
 93                    return ms.ToArray();
 94                }
 95                else
 96                {
 97                    MemoryStream ms = new MemoryStream();
 98                    ms.Write(data, 0, data.Length);
 99                    ms.Flush();
100                    ms.Position = 0;
101                    zip = new DeflateStream(ms, mode, true);
102                    MemoryStream os = new MemoryStream();
103                    int SIZE = 1024;
104                    byte[] buf = new byte[SIZE];
105                    int l = 0;
106                    do
107                    {
108                        l = zip.Read(buf, 0, SIZE);
109                        if (l == 0) l = zip.Read(buf, 0, SIZE);
110                        os.Write(buf, 0, l);
111                    } while (l != 0);
112                    zip.Close();
113                    return os.ToArray();
114                }
115            }
116            catch
117            {
118                if (zip != null) zip.Close();
119                return null;
120            }
121            finally
122            {
123                if (zip != null) zip.Close();
124            }
125        }
126
127        #region IDataTransfers 成员
128        /// <summary>
129        /// 获取所有字节流
130        /// </summary>
131        /// <returns></returns>
132        public byte[] GetAllBuffer()
133        {
134            if (buffer_all != null)
135                return buffer_all;
136            else return null;
137        }
138        /// <summary>
139        /// 设置压缩后字节流分块,每一块的大小
140        /// </summary>
141        /// <param name="length"></param>
142        public void SetBufferLength(int length)
143        {
144           this.get_buffer_length=length;
145        }
146        /// <summary>
147        /// 读取压缩后字节流一块,并提升字节流的位置
148        /// </summary>
149        /// <returns></returns>
150        public bool ReadNextBuffer()
151        {
152            bool bo;
153            if (remain_length > 0)
154            {
155                if (remain_length> get_buffer_length)
156                {
157                    buffer_currect = new byte[get_buffer_length];
158
159                    stream.Read(buffer_currect, 0, get_buffer_length);
160                    remain_length -= get_buffer_length;
161                }
162                else
163                {
164                    buffer_currect = new byte[remain_length];
165                    stream.Read(buffer_currect, 0, (int)remain_length);
166                    remain_length = 0;
167                }
168
169                bo = true;
170            }
171            else
172                bo = false;
173            return bo;
174           
175        }
176        /// <summary>
177        /// 获取当前块的字节流
178        /// </summary>
179        /// <returns></returns>
180        public byte[] GetCurrentBuffer()
181        {
182            if (buffer_currect != null)
183                return buffer_currect;
184            else
185                return null;
186
187        }
188
189        #endregion
190    }
191}
192

6. 服务端启动服务代码:

static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(DataTransfers));
            Console.Write("服务中");
            Console.Read();
            Console.Read();
        }

7. 客户端代码


 1 //实例化WCF客户端
 2            DataTransfersClient client = new DataTransfersClient();
 3            MemoryStream stream = new MemoryStream();
 4            byte[] buffer;
 5            //获取所用块压缩流,并组装
 6            while(client.ReadNextBuffer()) 
 7            {
 8                buffer = client.GetCurrentBuffer();
 9                stream.Write(buffer,0,buffer.Length);
10            }
11            stream.Position = 0;
12            buffer= new byte[stream.Length] ;
13            stream.Read(buffer,0,buffer.Length);
14            stream.Close();
15            //解压压缩流
16            byte[] bytes = Compression(buffer,CompressionMode.Decompress);
17            stream = new MemoryStream(bytes);
18            IFormatter formatter = new BinaryFormatter();
19            //反序列化
20            DataSet ds=(DataSet) formatter.Deserialize(stream);
21            stream.Close();
22            this.dataGridView1.DataSource = ds;
23            this.dataGridView1.DataMember="test";
24            this.label1.Text = ds.Tables[0].Rows.Count.ToString();
25            client.Close();

8.
   WCF大数据量传输解决方案源码下载

时间: 2024-10-11 20:41:56

WCF大数据量传输解决方案的相关文章

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决方案都是千篇一律互相转发的,并且没有明确的解决方案或者按照,各个博客中的解决方案都没能解决这个问题. 为此我整整浪费了一天时间用来解决这个问题,而且用了最笨的办法一点点的尝试网上所查到的方案.对于精研WCF来说的这可能是一个小问题,但是对于仅仅了解wcf,一知半解的会很困惑.将解决方案贴出来希望能帮

大数据量传输时配置WCF的注意事项

原文:大数据量传输时配置WCF的注意事项 WCF传输数据量的能力受到许多因素的制约,如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题,应注意以下配置: 1.MaxReceivedMessageSize:获取或设置配置了此绑定的通道上可以接收的消息的最大大小. basicHttpBinding等预定义的绑定一般具有MaxReceivedMessageSize属性,CustomBinding则需要在Transport中定义. 示例代码: <bindings> <custom

关于webservice大数据量传输时的压缩和解压缩

当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据传输.执行的过程就是先把Dataset转化为xml进行传输,Dataset转化为xml的格式如下: [html] view plaincopy <DataSetName> <DataTableName> <Column1Name>.......</Column1Nam

WCF 大数据量如何从服务端传到客户端

当数据量很大时,想要从服务端传到客户端可能会遇到这几个问题:基础连接意外关闭:内存溢出:或时间过长. 下面是我在项目中实现客户端导出txt文件时解决方法.txt有150M左右. namespace XSGLSRV900 //服务端接口实现 { public class XSGLService : IXSGLService { //这些变量只能是静态的,如果是非静态的,在客户端每一次调用服务端都认为是新建一个服务对象,这些值将不再能读取到.关于WCF服务端的三种模式可参考http://www.cn

MYSQL数据库导入大数据量sql文件失败的解决方案

1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和数据"  .保存文件db_mras.sql文件. 2.导入sql文件.在MYSQL中新建数据库db_mras.选择数据库-----右击选择"运行SQL文件"-----选择文件db_mras.sql,运行. 现在发现运行失败,提示错误"MySQL server has g

大数据量、高并发数据库的高性能、高可用性解决方案

大数据量.高并发数据库的高性能.高可用性解决方案: 1.拆表:大表拆小表(垂直拆,水平拆:分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分:提高系统性能. 2.分库:把表放到不同的数据库,这也是分布式数据库的基础:提高系统性能. 3.分布式:不同的数据库放到不同的服务器:提高系统性能. 4.集群:使用数据库复制等技术组建集群,实现读写分离.备份等:提高系统性能.可用性. 5.缓存:对常用的数据进行缓存.提高系统性能. 6.备份:主从库,快照,热

大数据量业务订制和解决方案思考

大数据量的系统要经过对数据的用处分析和数据周期分析,以寻求更好的解决方案. 1:业务系统的基础数据,如人员基础信息(基础资料,权限等).数据可以KEEP在内存中.数据要分散存储.基础数据逻辑要简洁.使用增量更新.高峰期来临前提前更新基础数据 2:热数据处理此部分数据是各方面环境会频繁使用到的数据 对这部分数据的存储,比如 使用不一样的存储方式,比如建立高效的索引,使用SSD盘,或者使用mysql数据库存储 3:历史数据的迁移 近期数据 此类数据是需要最近频繁使用或者调用的数据,对OLTP系统而言

大数据量时Mysql的优化

(转自网络) 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL的出现暂时解决了这一危机.它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升.但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的.这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库. 虽然关系型数据库在海量数据中逊

大数据量高并发的数据库优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须