码迷,mamicode.com
首页 > 其他好文 > 详细

WCF大数据量传输解决方案

时间:2015-11-27 10:49:14      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

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


1. 场景:

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

2. 解决方案

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

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

B.如果压缩后的数据仍然较大时,可以再压缩流后,再对流进行拆分即可。
技术分享
                   (解决方案A图)
技术分享
                     (解决方案2)
 

3. WCF契约与服务实现设计静态图
技术分享
4. WCF契约与服务实现设计详细说明

契约接口详细说明
技术分享
服务类详细说明
技术分享

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

技术分享
 1技术分享using System;
 2技术分享using System.Collections.Generic;
 3技术分享using System.Linq;
 4技术分享using System.Runtime.Serialization;
 5技术分享using System.ServiceModel;
 6技术分享using System.Text;
 7技术分享///日期:2008-04-16
 8技术分享///作者:旋风
 9技术分享///来自:http://cnblogs.com/xuanfeng
10技术分享namespace 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技术分享


    实现契约服务代码

技术分享
  1技术分享using System;
  2技术分享using System.Data;
  3技术分享using System.Runtime.Serialization;
  4技术分享using System.Runtime.Serialization.Formatters.Binary;
  5技术分享using System.IO;
  6技术分享using System.IO.Compression;
  7技术分享using System.Collections.Generic;
  8技术分享using System.Linq;
  9技术分享using System.ServiceModel;
 10技术分享using System.Text;
 11技术分享///日期:2008-04-16
 12技术分享///作者:旋风
 13技术分享///来自:http://cnblogs.com/xuanfeng
 14技术分享namespace 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大数据量传输解决方案源码下载

WCF大数据量传输解决方案

标签:

原文地址:http://www.cnblogs.com/Alex80/p/4999780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!