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契约与服务代码实现:
契约代码

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-168
///作者:旋风9
///来自:http://cnblogs.com/xuanfeng10
namespace WCFDataTransfers11
{12

13
[ServiceContract(Namespace = "http://DataTransfers/Demao")]14
public interface IDataTransfers15
{ 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-1612
///作者:旋风13
///来自:http://cnblogs.com/xuanfeng14
namespace WCFDataTransfers15
{16
17
public class DataTransfers :IDataTransfers18
{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
try86
{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
else96
{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
do107
{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
catch117
{118
if (zip != null) zip.Close();119
return null;120
}121
finally122
{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
else163
{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
else172
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
else185
return null;186

187
}188

189
#endregion190
}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();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会生成很多的状 ...
随机推荐
- MVC——分页控件
不管是什么类型的网站,分页都是必不可少的功能实现.在这里记录一下我自己接触过的分页控件: 一. MvcPager控件(记得项目里添加MvcPager.dll的引用) 这里面比较常用的就 ——@Html ...
- 【JSP&Servlet学习笔记】4.会话管理
Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...
- phpstudy 下开启openssl
1.在php.ini里面的extension=php_openssl.dll是开启的状态,没有被注释. 2.里面的allow_url_fopen = On表示开启了. 3.如果你是Windows 64 ...
- mysql---整体备份和增量备份
整体备份: 对整张表或者整个数据库甚至所有数据库进行备份. 增量备份: 对某一范围内的数据进行备份. 1.整体备份: 对表进行备份: 针对存储引擎为myisam的表,可以直接复制frm.myd.myi ...
- 【转】C#中没有id 没有name C#怎么点击按钮
HTML按钮元素 <input type="submit" value="确定" class="dialogbtn" C# 执行代码 ...
- thinkphp表单上传文件并将文件路径保存到数据库中
上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` ( `id` int(11) ...
- MVC4升级MVC5 异常处理
使用过程中的一些烦人的事情,权当这篇文章是MVC4升级MVC5的异常合集吧,后期不定期更新. 在这里你可以看到ASP.NET MVC的发展历程以及你需要的版本和目前最稳定的版本.戳ASP.NET MV ...
- 2016031901 - ubuntu15.1安装驱动
个人使用u盘安装的ubuntu15.1,安装后找不到无线,主要是驱动没有安装的问题. 解决方案如下: 01.wife无法找到 02.pool文件夹内都是驱动,我们需要的网络驱动也在内 03.网络驱动包 ...
- 【@Transactional】Spring 之注解事务 @Transactional
spring 事务注解 默认遇到throw new RuntimeException("...");会回滚 需要捕获的throw new Exception("...&q ...
- 对C语言中sizeof细节的三点分析
转自对C语言中sizeof细节的三点分析 1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行. 那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试 ...