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会生成很多的状 ...
随机推荐
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: / 0 n=0 f(n)= ...
- iOS 分类思想(1)
1.需求:如果对一个类在不更改代码的基础上要为它再扩充额外的方法可以使用继承和分类 2.分类 作用:可以在不修改原来类代码的基础上,给某一个类扩充一些对象方法或者类方法,因此一个类可以有多个分类 实现 ...
- mysql远程访问的权限
1.改表法 mysql>use mysql; mysql>update user set host = '%' where user = 'root'; 2.授权法 例如,你想myuser ...
- 存储过程/游标/mysql 函数
存储过程和函数(存储在 mysql数据库中的 proc表,所以检查有没有这个表)存储过程是一种存储程序(如正规语言里的子程序一样),mysql支持有两种:存储过程,在其他SQL语句中可以返回值的函数( ...
- jQuery Ajax无刷新操作
下面是“无刷新登录”的例子,采用Ashx+jQuery Ajax实现. //后台实例代码 ashx文件(可替换为从数据库中读取) public void ProcessRequest(HttpCont ...
- WinForm 图形报表控件
http://wenku.baidu.com/link?url=hOCeHErshNOw6NScDG3Y6JjT1mD-A4xHhjthcHyrTgk5NmPRKf0eqeaee4LmKZX5jd7S ...
- php中的数组定义和使用
<?php //这个是一个php关于数组的例子,简要的说明了数组的基本使用 //定义一个字符串数组 $fruit = array(\"apple\",\"orang ...
- Python 基础篇:字符串、列表操作
字符串操作 判断是否为数字 string = "200" string.isdigit() >>false 待完善.. 列表操作 列表是我们最以后最常用的数据类型之一, ...
- python【第五篇】常用模块学习
一.主要内容 模块介绍 time &datetime模块 random os sys shutil json & pickle shelve xml处理 yaml处理 configpa ...
- vim file save as
the command of vim to save as the file :w new_file_name