利用DataSet实现WCF传输数据
创始人
2024-06-11 03:11:57
0

在网上看了大量关于WCF相关的资料,WCF现在是一个强大的技术,然后就产生一个想法.如何实现WCF传输数据,这个服务的主要功能是客户端调用服务端的一个函数,这个函数接受一个DataSet的参数,然后再返回一个DataSet,当然这个功能很简单,几行代码就搞定了.

#T#可是当如果DataSet内的数据量非常大的时候, 那就麻烦了.(暂不讨论传输大数据量的DataSet是否合理),WCF默认最大传输数据量为64K,当然可以实现修改配置文件来传输大数据量,可是不能解决本质的问题,我目前解决这个问题的方式是,把一个DataSet序列化为一个字节,然后把这些字节进行压缩,然后每次发送一小段字节回去,接受到这个些字节以后然后在解压缩,再反序列化为为DataSet,这样就实现了,传入一个DataSet然后再返回一个DataSet,这样的话,就需要用到 WCF的双向通信,使用回调函数,WCF传输数据代码如下:

  1. DuplexChannelFactory channelFactory = new DuplexChannelFactory(new InstanceContext(new ClientCallBack()), "defaultEndpoint");  
  2. IHello getHello = channelFactory.CreateChannel();  
  3. //传入DataSet到服务端  
  4. getHello.SayHelloTo();  
  5.  
  6. //首先客户端调用服务端的函数SayHelloTo(),  
  7. public void SayHelloTo()  
  8. {  
  9. //读取客户端传入的DataSet  
  10. #region 服务端的数据  
  11. ICallback callback = OperationContext.Current.GetCallbackChannel();  
  12.    
  13. int intNum = callback.getTimes() + 1; //获取读取字节流的次数  
  14. MemoryStream Mstream = new MemoryStream();  
  15. byte[] getbyte;  
  16. for (int i = 1; i < intNum; i++)  
  17. {  
  18. getbyte = callback.getBytes(i);  
  19. Mstream.Write(getbyte,0,getbyte.Length);//写到内存中  
  20.  }  
  21. Mstream.Position = 0;  
  22. getbyte = new byte[Mstream.Length];  
  23. Mstream.Read(getbyte, 0, getbyte.Length);//从内存中读到getbyte中  
  24. Mstream.Close();  
  25.  
  26. //反序列化  
  27. ServiceData = KCDataFormatter.RetrieveDataSetDecompress(getbyte);  
  28. //----------------------------  
  29. //此处得到序列化以后的字节,可以再反序列化为DataSet,得到DataSet就可以对个DataSet做处理,删除,修改,  
  30. //处理完成再把处理完成的DataSet赋值给ServiceData,就可以了  
  31. //----------------------------  
  32. #endregion  
  33. }  
  34. ICallback callback = OperationContext.Current.GetCallbackChannel();  
  35. 此时就会调用客户端的回调函数  
  36. public class ClientCallBack : ICallback  
  37. {  
  38. #region ICallBack 成员  
  39. //要上传的数据  
  40. public void getData()  
  41. {  
  42. DataSet ds = new DataSet("test");  
  43. DataTable table = new DataTable("test");  
  44. DataColumn column = new DataColumn("test");  
  45. column.DataType = Type.GetType("System.String");  
  46. table.Columns.Add(column);  
  47. DataRow row;  
  48. for (int i = 0; i < 200000; i++)  
  49. {  
  50. row = table.NewRow();  
  51. row["test"] = "Hello";  
  52. table.Rows.Add(row);  
  53. }  
  54. ds.Tables.Add(table);  
  55. byte_All = KCDataFormatter.GetBinaryFormatDataCompress(ds);  
  56. }  
  57. private int i = 1000; //每次读取字节的数量  
  58. byte[] byte_All;//获取要上传的字节流  
  59. MemoryStream Mstream;//流  
  60. public byte[] getBytes(int intNum)  
  61. {  
  62. int j = 1000;  
  63. byte[] buffer;  
  64. if (intNum < iti)//判断是否是最后一次循环  
  65. {  
  66. buffer = new byte[1000];  
  67. }  
  68. else  
  69. {  
  70.  
  71. int nn = byte_All.Length - ((iti - 1) * 1000);  
  72. buffer = new byte[nn];  
  73. j = nn;  
  74. }  
  75. int iold = (i * (intNum - 1));//记录上一次的字节位置  
  76. Mstream = new MemoryStream();  
  77. Mstream.Write(byte_All, iold, j);//从byte_All中的第iolld开始写入j(最多不超过)个到内存中  
  78. buffer = Mstream.ToArray();  
  79. Mstream.Close();  
  80. Mstream.Dispose();  
  81. return buffer;  
  82. }  
  83. private int iti = 0;//初始化循环次数  
  84. public int getTimes()//将数据流分为多少部分  
  85. {  
  86. getData();  
  87. int temp = byte_All.Length / 1000;  
  88. int intNum = byte_All.Length % 1000 != 0 ? temp + 1 : temp;  
  89. iti = intNum;  
  90. return intNum;  
  91. }  
  92. #endregion  
  93. }  

以上就是我想出来的关于WCF传输数据一部分的代码,希望大家看了会有帮助。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...