• 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. 服务端启动服务代码:
    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();

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

    注:生成代理类命令

    SvcUtil /language:c# /a  /d:test   /out:QueryDataAccess.cs /config:App http://192.168.0.113:1213/

  • 相关阅读:
    windows phone 独立存储空间的操作 (2)(转)
    Windows Phone笔记(9)使用独立存储(上)(转)
    Windows Phone笔记(8)页面间数据共享
    windows phone 使用相机并获取图片(3)(转)
    Windows Phone笔记(11)使用独立存储(下)
    Windows Phone笔记(7)页面间导航以及数据传递(转)
    Windows Phone笔记(6)使用地图服务
    Windows Phone笔记(12)XAML基础知识(转)
    Mysql基础知识
    C语言中 数组作为函数形参传递相当于指针,在函数中不能得到数组长度,只能得到指针长度4
  • 原文地址:https://www.cnblogs.com/guanwz/p/2473599.html
Copyright © 2020-2023  润新知