`

WCF大数据量传输解决方案

    博客分类:
  • WCF
 
阅读更多

文章内容列表:
1. 场景:
2. 解决方案
3. WCF契约与服务实现设计静态图
4. WCF契约与服务实现设计详细说明
6. 服务端启动服务代码:
7. 客户端代码
8.   WCF大数据量传输解决方案源码下载


1. 场景:

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

2. 解决方案

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

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

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

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

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

 

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

 

[c-sharp] view plain copy
 
 print?
  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-16  
  8. ///作者:旋风  
  9. ///来自:http://cnblogs.com/xuanfeng  
  10. namespace 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. }  

 

 

[c-sharp] view plain copy
 
 print?
  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-16  
  12. ///作者:旋风  
  13. ///来自:http://cnblogs.com/xuanfeng  
  14. namespace 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. }  

 

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

 

[c-sharp] view plain copy
 
 print?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.ServiceModel;  
  6. ///日期:2008-04-16  
  7. ///作者:旋风  
  8. ///来自:http://cnblogs.com/xuanfeng  
  9. namespace WCFDataTransfers  
  10. {  
  11.     class RunServies  
  12.     {  
  13.         static void Main(string[] args)  
  14.         {  
  15.             ServiceHost host = new ServiceHost(typeof(DataTransfers));  
  16.             Console.Write("服务中......");  
  17.             Console.Read();  
  18.             Console.Read();  
  19.         }  
  20.     }  
  21. }  

 

 

7. 客户端代码

 

[c-sharp] view plain copy
 
 print?
  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();  
  26.   
  27. private byte[] Compression(byte[] data, CompressionMode mode)  
  28. {  
  29.     DeflateStream zip = null;  
  30.     try  
  31.     {  
  32.         if (mode == CompressionMode.Compress)  
  33.         {  
  34.             MemoryStream ms = new MemoryStream();  
  35.             zip = new DeflateStream(ms, mode, true);  
  36.             zip.Write(data, 0, data.Length);  
  37.             zip.Close();  
  38.             return ms.ToArray();  
  39.         }  
  40.         else  
  41.         {  
  42.             MemoryStream ms = new MemoryStream();  
  43.             ms.Write(data, 0, data.Length);  
  44.             ms.Flush();  
  45.             ms.Position = 0;  
  46.             zip = new DeflateStream(ms, mode, true);  
  47.             MemoryStream os = new MemoryStream();  
  48.             int SIZE = 1024;  
  49.             byte[] buf = new byte[SIZE];  
  50.             int l = 0;  
  51.             do  
  52.             {  
  53.                 l = zip.Read(buf, 0, SIZE);  
  54.                 if (l == 0) l = zip.Read(buf, 0, SIZE);  
  55.                 os.Write(buf, 0, l);  
  56.             } while (l != 0);  
  57.             zip.Close();  
  58.             return os.ToArray();  
  59.         }  
  60.     }  
  61.     catch  
  62.     {  
  63.         if (zip != null) zip.Close();  
  64.         return null;  
  65.     }  
  66.     finally  
  67.     {  
  68.         if (zip != null) zip.Close();  
  69.     }  
  70. }  

 

分享到:
评论

相关推荐

    wcf大数据量传输(客户段->服务段 服务段->客户段)

    在处理大数据量传输时,由于网络带宽限制和性能考虑,通常需要采取特殊策略。本文将深入探讨如何在WCF中实现大数据量的高效传输,特别是涉及到数据的压缩和分段传输。 首先,让我们了解大数据量在WCF中的挑战。当...

    Wcf传输大数据

    在压缩包文件“WCF大数据量传输解决方案”中,可能包含了具体的代码示例和配置文件,用于演示如何实现上述策略。你可以根据这些资源进行实际操作,以适应项目需求。通过调整WCF配置和采用适当的传输策略,可以有效地...

    高性能的WCF解决方案

    **高性能的WCF解决方案** Windows Communication Foundation (WCF) 是微软提供的一种面向服务的通信框架,用于构建可互操作的、安全的、可靠的企业级应用程序。在本文中,我们将深入探讨如何优化WCF服务,以实现更...

    设计高性能的WCF解决方案 经典中的经典

    在构建高性能的Windows ...总的来说,设计高性能的WCF解决方案需要全面考虑传输层、序列化、编码器的选择,以及客户端和服务端的优化策略。通过细致的架构设计和代码优化,我们可以构建出既高效又灵活的分布式系统。

    C#编程实践中问题与解决方案总结

    文章内容包括: windows form (窗体) 之间传值小结 ;...WCF传输大数据的三种解决方案:WCF传输大数据量DataSet ,在WCF中分页传输数据(Duplex方式),序列化传输; WCF消息回调与心跳包的解决方案

    WCF系列课程 webcast

    WebAPI更专注于RESTful服务,而ASP.NET Core提供了更现代、轻量级的跨平台解决方案。 在本系列课程的webcast中,您将逐步学习这些概念,并通过实践案例加深理解。通过学习,您将能够利用WCF构建高效、可靠的企业级...

    WCF程序(发布、定义)

    对于大数据量传输,WCF提供流传输模式,允许数据分块传输,降低内存消耗。同时,可以通过设置最大消息大小、缓冲区大小等配置参数来优化性能。 6. **WCF标签** - **WCF**: 代表Windows Communication Foundation,...

    WCF视频音频监控 最近做的一个小东东

    3. **监控程序**:这是一个完整的监控解决方案,包括数据采集(摄像头和桌面)、数据传输(通过WCF)以及客户端的展示和控制。 综合以上信息,我们可以深入探讨WCF在视频监控中的应用,以及可能涉及的技术点: 1. ...

    WCF TCP 源码下载实例

    压缩包中的`HostTcpTest.sln`是一个Visual Studio解决方案,包含服务端(Host)和客户端(Client)项目。以下是对这两个项目的简要介绍: 1. **HostTcpTest** - 这是服务端项目,负责定义和暴露WCF服务。开发者通常...

    WCF大文件断点下载.rar_wcf_wcf文件上传_worthsdn_下载_远程下载

    8. **WorthSDN**:标签中的"WorthSDN"可能是某种特定的解决方案或框架,它可能提供了简化WCF文件上传和下载的工具,使得开发者能够更方便地实现上述功能。 通过深入理解WCF的工作原理,结合上述策略,我们可以构建...

    wcfrest的实现

    通过研究这个解决方案,你可以深入了解WCF REST服务的完整工作流程,以及如何在实际项目中部署和使用它们。 学习和掌握WCF REST的实现,不仅有助于理解服务端开发,还能提高你在分布式系统设计和Web服务交互方面的...

    面向 SOA 的 WCF 开发框架简介

    - **高可用性和可扩展性**:通过支持集群和负载均衡,WCF能够处理大量并发请求和大数据量处理需求。 #### 三、WCF 与 SOA 的关系 WCF 作为一种技术平台,为实现SOA架构提供了强有力的支持。具体来说: - **服务端...

    C#写的WCF文件上传示例

    - **BufferSize**: 调整WCF绑定的缓冲区大小,以控制每次传输的数据量,减少内存压力。 - **MaxReceivedMessageSize**: 在服务配置中设置这个值,限制接收消息的最大大小,防止恶意大文件攻击。 - **TransferMode*...

    基于WCF与P2P的分布式大规模考试平台实例研究.pdf

    本文研究了基于WCF与P2P技术的大规模考试平台的实现原理,涉及了分布式系统、网络通信、服务扩展性等多个方面,为开发大规模考试平台提供了一种新的解决方案。 首先,文章提到了大规模考试平台在设计上面临的主要...

    WCF培训资料以及说明

    WCF是微软对先前分布式技术如ASP.NET Web Services、Remoting和Message Queuing (MSMQ)的整合与升级,旨在提供一种更加灵活、安全和高性能的解决方案。 #### 第四节 学习WCF的资源 学习WCF可以参考微软官方文档、...

    WCF 即时通讯相关完全源码

    **WCF即时通讯详解** Windows Communication Foundation (WCF) 是微软.NET ...它涉及到服务端和客户端的设计、消息传输、安全性和数据库集成等多个方面,是.NET开发人员构建企业级即时通讯解决方案的重要工具。

    WCF揭秘基础部分 实例(vs2010)

    - **面向连接**:如TCP,保持客户端和服务之间的连接,适合大数据量传输。 - **面向无连接**:如HTTP,适合少量数据和低带宽场景。 ### 5. 安全性 WCF提供了多种安全机制: - **身份验证**:支持基本、digest、...

    WCF 返回json 格式

    通过打开并编译这个解决方案,可以启动WCF服务,并测试返回JSON格式数据的功能。 总之,创建一个返回JSON的WCF服务涉及定义服务接口,实现服务逻辑,配置服务行为和终结点,以及正确引用和使用JSON序列化库。通过...

    WCF学习笔记,一步一步教你学习WCF

    - **解决方案**: - 明确指定版本号。 - 使用`KnownType`属性。 #### 二十、枚举类型 - **定义**:枚举类型是在WCF中使用的预定义类型。 - **使用**: - 在服务契约中声明。 - 作为参数传递。 #### 二十一、...

Global site tag (gtag.js) - Google Analytics