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会生成很多的状 ...
随机推荐
- Trie的C++实现及HDU1251,hdu1671
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- sgu 103 Traffic Lights
这道题难得不是算法,而是处理. 题意就是让你求最短路,只有当两个点在某一秒颜色相同时,这条边才可以通行,输入首先给你 起点和终点, 然后给你 点数和边数, 接下来 n 行 初始颜色,初始颜色持续时间, ...
- Jar mismatch! Fix your dependencies的问题(转)
看到网上有说: 在开发Android项目的时候,有时需要引用多个项目作为library.在引用项目的时候,有时会出现“Jar mismatch! Fix your dependencies”错误. 这 ...
- 初识jQuery(适合初学者哟.........)
您要知道!! jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库. 微软公司甚至把jQuery作为他们的官方库.对 ...
- 算法之插入排序(inertionSort)
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,适用于少量数据的排序,时间复杂度为O(n^2). 插入排序属于稳定排序. 插入排序不需要构造新的数据 ...
- windows 使用excel导出的问题
解决 window server2008 r2 没有注册Ofiice组件的方法 .NET下在用Microsoft.Office.Interop.Excel及word 操作Excel和Word时, ...
- java 子类的实例化和代码块初始化过程
1,子类的实例化 1,子父类中的构造函数的特点. 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 为什么呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 子类 ...
- Yii通过控制台命令创建定时任务
假设Yii项目路径为 /home/apps/ 1. 创建文件 /home/apps/protected/commands/crons.php <?php $yii = '/home/apps/f ...
- 蓝桥杯——FJ字符串
FJ在沙盘上写了这样一些字符串: A1 = "A"1 A2 = "ABA"3 A3 = "ABACABA"7 A4 = "ABAC ...
- vs git .ignore
## Ignore Visual Studio temporary files, build results, and## files generated by popular Visual Stud ...