文章内容列表:
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. 服务端启动服务代码:
{
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();
WCF大数据量传输解决方案的更多相关文章
-
解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接
开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决 ...
-
WCF大数据量传输配置
WCF传输数据量的能力受到许多因素的制约,如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题,应注意以下配置: 1.MaxReceivedMessageSize:获取或设置配置了此绑定 ...
-
大数据量传输时配置WCF的注意事项
原文:大数据量传输时配置WCF的注意事项 WCF传输数据量的能力受到许多因素的制约,如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题,应注意以下配置: 1.MaxReceivedMe ...
-
【转载】大数据量传输时配置WCF的注意事项
WCF传输数据量的能力受到许多因素的制约,如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题,应注意以下配置: 1.MaxReceivedMessageSize:获取或设置配置了此绑定 ...
-
[转]POI大数据量Excel解决方案
全文转载自:jinshuaiwang的博客 目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本.另外一种是Apach ...
-
关于webservice大数据量传输时的压缩和解压缩
当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据 ...
-
WCF 客户端解决大数据量传输配置
1. 服务端返回数据给客户端报错 在客户端配置文件中,主要是配置maxReceivedMessageSize <system.serviceModel> <bindings> ...
-
.NET 大数据量并发解决方案
https://www.cnblogs.com/wxlevel/p/7484738.html
-
wcf传输Dataset大数据量 -压缩(一)
wcf传输Dataset大数据量 -压缩(一) 由于WCF不能传输DataTable(不能序列化),所以更多项目中都会使用DataSet作为查询集合的首选返回类型,但是由于DataSet会生成很多的状 ...
随机推荐
-
iOS-私有API与runtime
转载:http://www.jianshu.com/p/6167b9ce7af8 序 有朋友在做类似iTool的功能,跟我聊起来,这几天闲,就写了一个demo,不是正经做这个,还很粗略,具体干货诸位等 ...
-
AC小笔记
1:基本库函数的使用 Rand()函数,可以产生0~32767之间的随机数. a+rand()%(b-a) 可以得到 [a,b] 之间的随机数. 2:基本数据类型的使用 可以使用强制类型转换 例如: ...
-
.net程序员转行做手游开发经历(五)
大家好,真的是好长时间都没有更新博客了.上来博客园发现很多朋友还在关注我们,那给大家汇报下最近的一些进展. 收费版上线了,但是下载量不是很多,刚发布的时候下载每天的下载还是挺多,我们几个小伙伴在论坛. ...
-
CentOS下源码安装mplayer播放器
http://www.mplayerhq.hu/MPlayer/releases/ [root@ok MPlayer-1.2.1]# pwd /root/MPlayer-1.2.1 http://ww ...
-
重温 Win32 API ----- 截屏指定窗体并打印
朋友说在一个VC++6.0开发的项目中要增加打印窗体的功能,让帮忙写个代码供其调用. 这么老的IDE当然不想碰了,并且也不喜欢MFC笨拙不清晰的封装.所以决定採用纯Win32 API,然后用C++类简 ...
-
windows已安装solr
下载地址:http://archive.apache.org/dist/lucene/solr/ 操作环境: Win7,Tomcat6, Solr4.3, Jdk6 下载solr4.3的包,解压到本 ...
-
今天学习的裸板驱动之GPIO实验学习心得
GPIO分成很多组今天学习的这个芯片的GPIO有GPA-GPJ个组.具体可在芯片手册中看到. GPIO有很多寄存器,今天学习的这个芯片,他的寄存器分为以下几种类型: (1)端口控制寄存器 (2)端口数 ...
-
如何解决WebBrowser.DocumentCompleted事件的多次调用
转载:https://www.cnblogs.com/rchlz/archive/2009/02/27/1399274.html 关于DocumentCompleted事件,MSDN给出的解释是在文档 ...
-
Hadoop hbase集群断电数据块被破坏无法启动
集群机器意外断电重启,导致hbase 无法正常启动,抛出reflect invocation异常,可能是正在执行的插入或合并等操作进行到一半时中断,导致部分数据文件不完整格式不正确或在hdfs上blo ...
-
4A - 排序
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数 ...