C# 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        IDataTransfers 成员#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. 客户端代码

Code

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();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值