1、直接返回DataSet对象

  特点:通常组件化的处理机制,不加任何修饰及处理;

  优点:代码精减、易于处理,小数据量处理较快;

  缺点:大数据量的传递处理慢,消耗网络资源;

  建议:当应用系统在内网、专网(局域网)的应用时,或外网(广域网)且数据量在KB级时的应用时,采用此种模式。

2、返回DataSet对象用Binary序列化后的字节数组

  特点:字节数组流的处理模式;

  优点:易于处理,可以中文内容起到加密作用;

  缺点:大数据量的传递处理慢,较消耗网络资源;

  建议:当系统需要进行较大数据交换时采用。

3、返回DataSetSurrogate对象用Binary序列化后的字节数组

  特点:微软提供的开源组件;

  优点:易于处理,可以中文内容起到加密作用;

  缺点:大数据量的传递处理慢,较消耗网络资源;

  建议:当系统需要传输中文数据或需要加密时采用此种方式

4、返回DataSetSurrogate对象用Binary序列化并Zip压缩后的字节数组

  特点:对字节流数组进行压缩后传递;

  优点:当数据量大时,性能提高效果明显,压缩比例大;

  缺点:相比第三方组件,压缩比例还有待提高;

  建议:当系统需要进行大数据量网络数据传递时,建议采用此种可靠、高效、免费的方法。

  测试用例:SqlServer2000数据库,数据量大小40000行,字段数10个,结果如下:

使用方法

用时(秒)

数据量(Byte)

大小

百分比(%)

直接返回DataSet

12.625

19629414

100%

返回二进制序列化后DataSet

9.712

12049645

61.38%

返回转化DataSetSurrogate的DataSet 并且二进制序列化后

7.943

5138990

26.18%

返回转化DataSetSurrogate的DataSet 并且二进制序列化后使用zip压缩

7.619

978033

4.98%

  1. using System;
  2. using System.Data;
  3. using System.Web;
  4. using System.Collections;
  5. using System.Web.Services;
  6. using System.Web.Services.Protocols;
  7. using System.ComponentModel;
  8.  
  9. using System.IO;
  10. using System.IO.Compression;
  11. using System.Data.SqlClient;
  12. using System.Runtime.Serialization.Formatters.Binary;
  13.  
  14. namespace DataSetWebService
  15. {
  16. /// <summary>
  17. /// Service1 的摘要说明
  18. /// </summary>
  19. [WebService(Namespace = "http://tempuri.org/")]
  20. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  21. [ToolboxItem(false)]
  22. public class DataSetService : System.Web.Services.WebService
  23. {
  24.  
  25. [WebMethod(Description="直接返回DataSet对象")]
  26. public DataSet GetDataSet()
  27. {
  28. //http://www.dzbsoft.com XT_TEXT
  29. string sql = "select * from XT_TEXT";
  30. SqlConnection conn = new SqlConnection("Server=60.28.25.58;DataBase=s168593;user id=s168593;password=h0y+FeC*;");
  31. conn.Open();
  32. SqlDataAdapter dataAd = new SqlDataAdapter(sql, conn);
  33. DataSet DS = new DataSet("XT_TEXT");
  34. dataAd.Fill(DS);
  35. conn.Close();
  36. return DS;
  37. }
  38.  
  39. [WebMethod(Description = "返回DataSet对象用Binary序列化后的字节数组")]
  40. public byte[] GetDataSetBytes()
  41. {
  42. DataSet DS = GetDataSet();
  43. BinaryFormatter ser = new BinaryFormatter();
  44. MemoryStream ms = new MemoryStream();
  45. ser.Serialize(ms, DS);
  46. byte[] buffer = ms.ToArray();
  47. return buffer;
  48. }
  49.  
  50. [WebMethod(Description = "返回DataSetSurrogate对象用Binary序列化后的字节数组")]
  51. public byte[] GetDataSetSurrogateBytes()
  52. {
  53. DataSet DS = GetDataSet();
  54. DataSetSurrogate dss = new DataSetSurrogate(DS);
  55. BinaryFormatter ser = new BinaryFormatter();
  56. MemoryStream ms = new MemoryStream();
  57. ser.Serialize(ms, dss);
  58. byte[] buffer = ms.ToArray();
  59. return buffer;
  60. }
  61.  
  62. [WebMethod(Description = "返回DataSetSurrogate对象用Binary序列化并ZIP压缩后的字节数组")]
  63. public byte[] GetDataSetSurrogateZipBytes()
  64. {
  65. DataSet DS = GetDataSet();
  66. DataSetSurrogate dss = new DataSetSurrogate(DS);
  67. BinaryFormatter ser = new BinaryFormatter();
  68. MemoryStream ms = new MemoryStream();
  69. ser.Serialize(ms, dss);
  70. byte[] buffer = ms.ToArray();
  71. byte[] Zipbuffer = Compress(buffer);
  72. return Zipbuffer;
  73. }
  74.  
  75. public byte[] Compress(byte[] data)
  76. {
  77. MemoryStream ms = new MemoryStream();
  78. Stream zipStream = null;
  79. zipStream = new GZipStream(ms, CompressionMode.Compress, true);
  80. zipStream.Write(data, , data.Length);
  81. zipStream.Close();
  82. ms.Position = ;
  83. byte[] compressed_data = new byte[ms.Length];
  84. ms.Read(compressed_data, , int.Parse(ms.Length.ToString()));
  85. return compressed_data;
  86. }
  87. }
  88. }
  89.  
  90. 客户端调用:C/S
  91.  
  92. using System;
  93. using System.Collections.Generic;
  94. using System.ComponentModel;
  95. using System.Data;
  96. using System.Drawing;
  97. using System.Text;
  98. using System.Windows.Forms;
  99.  
  100. using System.IO;
  101. using System.IO.Compression;
  102. using System.Data.SqlClient;
  103. using System.Runtime.Serialization.Formatters.Binary;
  104.  
  105. namespace Test
  106. {
  107. public partial class Form1 : Form
  108. {
  109. public Form1()
  110. {
  111. InitializeComponent();
  112. }
  113.  
  114. private void BindDataSet(DataSet DS)
  115. {
  116. this.dataGridView1.DataSource = DS.Tables[];
  117. }
  118.  
  119. private void button1_Click(object sender, EventArgs e)
  120. {
  121. com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
  122. DateTime dtBegin = DateTime.Now;
  123. DataSet DS = ds.GetDataSet();
  124. this.label1.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin);
  125. BindDataSet(DS);
  126. }
  127.  
  128. private void button2_Click(object sender, EventArgs e)
  129. {
  130. com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
  131. DateTime dtBegin = DateTime.Now;
  132. byte[] buffer = ds.GetDataSetBytes();
  133. DataSet DS = ds.GetDataSet();
  134. BinaryFormatter ser = new BinaryFormatter();
  135. DataSet dataset = ser.Deserialize(new MemoryStream(buffer)) as DataSet;
  136. this.label2.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin + " " + buffer.Length.ToString());
  137. BindDataSet(DS);
  138. }
  139.  
  140. private void button3_Click(object sender, EventArgs e)
  141. {
  142. com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
  143. DateTime dtBegin = DateTime.Now;
  144. byte[] buffer = ds.GetDataSetSurrogateBytes();
  145. BinaryFormatter ser = new BinaryFormatter();
  146. DataSet DS = ds.GetDataSet();
  147. DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
  148. DataSet dataset = dss.ConvertToDataSet();
  149. this.label3.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin + " " + buffer.Length.ToString());
  150. BindDataSet(DS);
  151. }
  152.  
  153. private void button4_Click(object sender, EventArgs e)
  154. {
  155. com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
  156. DateTime dtBegin = DateTime.Now;
  157. byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();
  158. byte[] buffer = UnZipClass.Decompress(zipBuffer);
  159. BinaryFormatter ser = new BinaryFormatter();
  160. DataSet DS = ds.GetDataSet();
  161. DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
  162. DataSet dataset = dss.ConvertToDataSet();
  163. this.label4.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin + " " + zipBuffer.Length.ToString());
  164. BindDataSet(DS);
  165. }
  166.  
  167. }
  168. }
  169.  
  170. UnZipClass.cs
  171.  
  172. using System;
  173. using System.Collections.Generic;
  174. using System.Text;
  175. using System.IO;
  176. using System.IO.Compression;
  177.  
  178. namespace Test
  179. {
  180. public static class UnZipClass
  181. {
  182. /// <summary>
  183. /// Decompresses the specified data.
  184. /// </summary>
  185. /// <param name="data">The data.</param>
  186. /// <returns></returns>
  187. public static byte[] Decompress(byte[] data)
  188. {
  189. try
  190. {
  191. MemoryStream ms = new MemoryStream(data);
  192. Stream zipStream = null;
  193. zipStream = new GZipStream(ms, CompressionMode.Decompress);
  194. byte[] dc_data = null;
  195. dc_data = EtractBytesFormStream(zipStream, data.Length);
  196. return dc_data;
  197. }
  198. catch
  199. {
  200. return null;
  201. }
  202. }
  203.  
  204. public static byte[] EtractBytesFormStream(Stream zipStream, int dataBlock)
  205. {
  206. try
  207. {
  208. byte[] data = null;
  209. int totalBytesRead = ;
  210. while (true)
  211. {
  212. Array.Resize(ref data, totalBytesRead + dataBlock + );
  213. int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
  214. if (bytesRead == )
  215. {
  216. break;
  217. }
  218. totalBytesRead += bytesRead;
  219. }
  220. Array.Resize(ref data, totalBytesRead);
  221. return data;
  222. }
  223. catch
  224. {
  225. return null;
  226. }
  227. }
  228. }
  229. }

C# 之 提高WebService性能大数据量网络传输处理的更多相关文章

  1. WebService - 怎样提高WebService性能 大数据量网络传输处理

    直接返回DataSet对象 返回DataSet对象用Binary序列化后的字节数组 返回DataSetSurrogate对象用Binary序列化后的字节数组 返回DataSetSurrogate对象用 ...

  2. WebService处理大数据量数据

    在通过WebService处理大数据量数据时出现如下错误: soap fault: 运行配置文件中指定的扩展时出现异常. ---> 超过了最大请求长度. 解决方法: 因为上传的文件大于系统默认配 ...

  3. WebService下实现大数据量的传输

    设置RemotingFormat = SerializationFormat.Binary;再序列化,通过WebService传输,客户端接收,再反序列化,确实效果大大的优于直接传送DataSet,不 ...

  4. 提高MYSQL大数据量查询的速度

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  5. 【SQL server初级】数据库性能优化一:数据库自身优化(大数据量)

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文 ...

  6. MySQL大数据量分页性能优化

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  7. sql server 2005 大数据量插入性能对比

    sql server 2005大数据量的插入操作 第一,写个存储过程,传入参数,存储过程里面是insert操作, 第二,用System.Data.SqlClient.SqlBulkCopy实例方法, ...

  8. cxf怎样提高webservice性能,及访问速度调优

    性能: 1. 启用FastInfoset(快速信息集)webservice的性能实在是不敢恭维.曾经因为webservice吞吐量上不去,对webservice进行了一些性能方面的优化,采用了Fast ...

  9. MySQL大数据量快速分页实现(转载)

    在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢?     般刚开始学SQL语句的时候,会这 ...

随机推荐

  1. 题解-AtCoder-agc006C Rabbit Exercise

    Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...

  2. VS2017打包C#桌面应用

    原文地址:https://blog.csdn.net/houheshuai/article/details/78518097 在要打包项目的解决方案 右键→添加→ 新建项目 后出现如下选择 如果没有V ...

  3. bigfile tablespace

    背景       这次终于有个linux实际迁移oracle的机会了,之前都是学习实验.想起最早时,都是windows搞oracle,又让我想起多年期一个项目,数据量太大及计算逻辑太复杂,我用存储过程 ...

  4. 码云 Git No network connection

    背景 git,好久没用了都.心血来潮还是赶紧熟悉下吧.果不其然,每次要熟悉或开始一个东西,立马就出现问题.本来好好的环境竟然不行了,搞定后感觉应该是换了网络环境的事.这倒次要,主要让我想起了最初学习g ...

  5. Zabbix3.2监控Windows的内存使用百分比并在内存使用率超过85%的时候触发报警

    内存使用率key:vm.memory.size[pused]

  6. vmware不能装ghost系统怎么解决

    一般情况下一台电脑最好只安装一个系统,因为多系统容易出现问题,所以很多用户都会在Vmware虚拟机上安装其他的系统,为了安装的方便,我们会选择ghost版的系统快速安装,但是有用户遇到vmware虚拟 ...

  7. FTRL优化算法

    飞机票 FTRL

  8. ModuleNotFoundError: No module named 'requests'

    1.问题描述 DOS 执行 .py 脚本报错: ModuleNotFoundError: No module named 'requests' ModuleNotFoundError: No modu ...

  9. Java语法基础常见疑惑解答

    1. 类是java的最小单位,java的程序必须在类中才能运行 2. java函数加不加static有何不同 java中声明为static的方法称为静态方法或类方法.静态方法可以直接调用静态方法,访问 ...

  10. ionic3 极光推送

    参考网站:http://www.jianshu.com/p/eb8ab29329d9 遇到的问题是  执行以下命令一直报错 cordova plugin add https://github.com/ ...