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会生成很多的状 ...
随机推荐
- 九度OJ 1447 最短路 1008 最短路径问题
题目地址:http://ac.jobdu.com/problem.php?pid=1447 题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上 ...
- OpenJudge 2774 木材加工
1.链接: http://bailian.openjudge.cn/practice/2774/ 2.题目: 总Time Limit: 1000ms Memory Limit: 65536kB Des ...
- ASP.NET取得Request URL的各个部分
我們在開發網頁應用程式,時常需要去解析網址(Request.Url)的每個片段,進行一些判斷.例如說 "http://localhost:1897/News/Press/Content.as ...
- socket通信_笔记
(socket通信) 客户端与服务器端通信问题: 我们首先要了解一个概念性的词汇:Socket socket的英文原义是“孔”或“插座”.作为进程通信机制,取后一种意思.通常也称作“套接字”,用于描述 ...
- linux修改时间 时区
查看时区:date -R 修改时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 二.时间 1.查看时间和日期 date 2.设置时间和日期 ...
- PhpStorm一次性折叠所有函数或者方法
有时候一个类实里面的方法实在太多了,要找到指定的方法很慢,我一般都是通过ctrl+F12直接显示一个弹出层,里面只有这个类的属性和方法,点击就能快速定位了.但是有时候是一个类里面找来找去,这个访问就不 ...
- python 脚本
mag3.py 1,import import sys from org.eclipse.jface.dialogs import MessageDialogfrom org.eclipse.core ...
- proteus画元件
一.元件概述 使用过“protel DXP”画元件的人想必对一个元件的构成已经非常清楚了.一个完整的元件包括如下几个部分: 元件 = 原理图元件模型 + PCB封装模型 + 电路仿真特性 1.原理图元 ...
- C#中的lock关键字(初识)
http://kb.cnblogs.com/page/88513/ 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互 ...
- Extjs4.2 多选下拉框
//多选下拉框 Ext.define('MDM.view.custom.MultiComboBox', { extend: 'Ext.form.ComboBox', alias: 'widget.mu ...