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契约与服务代码实现:
契约代码
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会生成很多的状 ...
随机推荐
- Poj 1054 The Troublesome Frog / OpenJudge 2812 恼人的青蛙
1.链接地址: http://poj.org/problem?id=1054 http://bailian.openjudge.cn/practice/2812 2.题目: 总时间限制: 10000m ...
- ajax查询数据返回结果不变
在使用流水号的时候,Google浏览器没有问题,但是IE有缓存,如果ajax请求的参数没有变化,那么就会返回缓存里的数据 解决方法:ajax请求的时候传值的参数设置一个时间戳就OK了(没什么特别意义, ...
- python(二)基础
1.lambda表达式(一般格式为冒号前边是参数冒号后边是返回值) 单参数: 多参数: 我们如果实现一个普通的filter过滤函数过滤掉偶数: 而我们如果用lambda表达式就很简便: 2.递归 普通 ...
- Cakephp 创建无模型的Controller
控制器(Controller)如果没有特定的表/模型关联的话,哪怕建测试都会出错,但你可以加一行到控制器(Controller)里就好了public $uses=array(); 或者 public ...
- RHEL 6.4 64bit kettle5.01导入xlsx格式的excel时报错
环境:RHEL 6.4 64bit : kettle5.01:xlsx格式的excel 创建的job,在spoon里面运行都没有问题(Linux和windows) 在windows的命令行运行也没有问 ...
- 使用memcache(thinkphp框架学习)
$memcache = new Memcache; $memcache->connect("localhost",11211); $memcache->set('sxt ...
- sublime c++ builder
rt, mark { "cmd": ["g++", "${file}", "-o", "${file_path ...
- 在Windowx下创建以点开头的.hatccess文件
转自:在Windowx下创建以点开头的.hatccess文件 Windows有些目录名是不能创建的,有一些文件按照常规方式也是不能创建的,如在Windows下创建文件夹名为con的目录就不行,在win ...
- C#并行和多线程编程_(1)认识Parallel
Parallel: 英 [ˈpærəlel] 美 [ˈpærəˌlɛl] ,并联的,并行的. 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性 ...
- 开发软件设计模型 visual studio UML
http://www.ibm.com/developerworks/cn/rational/rationaledge/content/feb05/bell/ http://msdn.microsoft ...