您的位置:首页 > 大数据

WCF大数据量传输解决方案

2012-11-17 19:44 337 查看
文章内容列表:

1. 场景:

2. 解决方案

3. WCF契约与服务实现设计静态图

4. WCF契约与服务实现设计详细说明

6. 服务端启动服务代码:

7. 客户端代码

8. WCF大数据量传输解决方案源码下载

1. 场景:

WCF在网络传输中,大数据量传输造成网络阻塞,宽带无法承受;

2. 解决方案

解决WCF在网络传输中的大数据量问题:

A.需要把相关数据序列化成字节流,再对字节流进行压缩,再进行传输,到了客户端再做反向操作便可获得原始数据。

B.如果压缩后的数据仍然较大时,可以再压缩流后,再对流进行拆分即可。



(解决方案A图)



(解决方案2)

3. WCF契约与服务实现设计静态图



4. WCF契约与服务实现设计详细说明



5. WCF契约与服务代码实现:

契约代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
///日期:2008-04-16
///作者:旋风
///来自:http://cnblogs.com/xuanfeng
namespace WCFDataTransfers
{

[ServiceContract(Namespace = "http://DataTransfers/Demao")]
public interface IDataTransfers
{
/// <summary>
/// 获取所用压缩后字节流
/// </summary>
/// <returns></returns>
[OperationContract]
byte[] GetAllBuffer();
/// <summary>
/// 设置压缩后字节流分块,每一块的大小
/// </summary>
/// <param name="length"></param>
[OperationContract]
void SetBufferLength(int length);
/// <summary>
/// 读取压缩后字节流一块,并提升字节流的位置
/// </summary>
/// <returns></returns>
[OperationContract]
bool ReadNextBuffer();
/// <summary>
/// 获取当前块的字节流
/// </summary>
/// <returns></returns>
[OperationContract]
byte[] GetCurrentBuffer();

}

}


实现契约服务代码

using System;
using System.Data;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.IO.Compression;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
///日期:2008-04-16
///作者:旋风
///来自:http://cnblogs.com/xuanfeng
namespace WCFDataTransfers
{

public class DataTransfers :IDataTransfers
{
/// <summary>
/// 无参数构造函数
/// </summary>
public DataTransfers()
{

InitBuffers(InitTestDataSet());
}

private byte[] buffer_all = null;
private byte[] buffer_currect = null;
private int  get_buffer_length = 1000;
private long  remain_length;
private MemoryStream stream;
/// <summary>
/// 生成一个测试的数据集
/// </summary>
/// <returns></returns>
private DataSet InitTestDataSet()
{
DataSet ds = new DataSet("test");
DataTable table = new DataTable("test");
DataColumn column = new DataColumn("test");
column.DataType = Type.GetType("System.String");
table.Columns.Add(column);
DataRow row;
for (int i = 0; i < 100000;i++ )
{
row = table.NewRow();
row["test"] = "测试数据 !";
table.Rows.Add(row);
}

ds.Tables.Add(table);

return ds;

}
/// <summary>
/// 初始化压缩字节流
/// </summary>
/// <param name="ds"></param>
private void InitBuffers(DataSet ds)
{

IFormatter formatter = new BinaryFormatter();
MemoryStream stream_ = new MemoryStream();
formatter.Serialize(stream_, ds);
buffer_all = stream_.ToArray();
stream_.Close();
byte[] bytes_c = Compression(buffer_all, CompressionMode.Compress);
stream = new MemoryStream(bytes_c);
stream.Position = 0;
remain_length = stream.Length;

}
/// <summary>
/// 提供内部使用压缩字流的方法
/// </summary>
/// <param name="data"></param>
/// <param name="mode"></param>
/// <returns></returns>
private  byte[] Compression(byte[] data, CompressionMode mode)
{
DeflateStream zip = null;
try
{
if (mode == CompressionMode.Compress)
{
MemoryStream ms = new MemoryStream();
zip = new DeflateStream(ms, mode, true);
zip.Write(data, 0, data.Length);
zip.Close();
return ms.ToArray();
}
else
{
MemoryStream ms = new MemoryStream();
ms.Write(data, 0, data.Length);
ms.Flush();
ms.Position = 0;
zip = new DeflateStream(ms, mode, true);
MemoryStream os = new MemoryStream();
int SIZE = 1024;
byte[] buf = new byte[SIZE];
int l = 0;
do
{
l = zip.Read(buf, 0, SIZE);
if (l == 0) l = zip.Read(buf, 0, SIZE);
os.Write(buf, 0, l);
} while (l != 0);
zip.Close();
return os.ToArray();
}
}
catch
{
if (zip != null) zip.Close();
return null;
}
finally
{
if (zip != null) zip.Close();
}
}
IDataTransfers 成员
}
}


6. 服务端启动服务代码:

static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(DataTransfers));
Console.Write("服务中");
Console.Read();
Console.Read();
}


7. 客户端代码

//实例化WCF客户端
DataTransfersClient client = new DataTransfersClient();
MemoryStream stream = new MemoryStream();
byte[] buffer;
//获取所用块压缩流,并组装
while(client.ReadNextBuffer())
{
buffer = client.GetCurrentBuffer();
stream.Write(buffer,0,buffer.Length);
}
stream.Position = 0;
buffer= new byte[stream.Length] ;
stream.Read(buffer,0,buffer.Length);
stream.Close();
//解压压缩流
byte[] bytes = Compression(buffer,CompressionMode.Decompress);
stream = new MemoryStream(bytes);
IFormatter formatter = new BinaryFormatter();
//反序列化
DataSet ds=(DataSet) formatter.Deserialize(stream);
stream.Close();
this.dataGridView1.DataSource = ds;
this.dataGridView1.DataMember="test";
this.label1.Text = ds.Tables[0].Rows.Count.ToString();
client.Close();


8.

WCF大数据量传输解决方案源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: