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

创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为乳山企业提供专业的网站制作、做网站,乳山网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
#T#可是当如果DataSet内的数据量非常大的时候, 那就麻烦了.(暂不讨论传输大数据量的DataSet是否合理),WCF默认最大传输数据量为64K,当然可以实现修改配置文件来传输大数据量,可是不能解决本质的问题,我目前解决这个问题的方式是,把一个DataSet序列化为一个字节,然后把这些字节进行压缩,然后每次发送一小段字节回去,接受到这个些字节以后然后在解压缩,再反序列化为为DataSet,这样就实现了,传入一个DataSet然后再返回一个DataSet,这样的话,就需要用到 WCF的双向通信,使用回调函数,WCF传输数据代码如下:
- DuplexChannelFactory
 channelFactory = new DuplexChannelFactory (new InstanceContext(new ClientCallBack()), "defaultEndpoint"); - IHello getHello = channelFactory.CreateChannel();
 - //传入DataSet到服务端
 - getHello.SayHelloTo();
 - //首先客户端调用服务端的函数SayHelloTo(),
 - public void SayHelloTo()
 - {
 - //读取客户端传入的DataSet
 - #region 服务端的数据
 - ICallback callback = OperationContext.Current.GetCallbackChannel
 (); - int intNum = callback.getTimes() + 1; //获取读取字节流的次数
 - MemoryStream Mstream = new MemoryStream();
 - byte[] getbyte;
 - for (int i = 1; i < intNum; i++)
 - {
 - getbyte = callback.getBytes(i);
 - Mstream.Write(getbyte,0,getbyte.Length);//写到内存中
 - }
 - Mstream.Position = 0;
 - getbyte = new byte[Mstream.Length];
 - Mstream.Read(getbyte, 0, getbyte.Length);//从内存中读到getbyte中
 - Mstream.Close();
 - //反序列化
 - ServiceData = KCDataFormatter.RetrieveDataSetDecompress(getbyte);
 - //----------------------------
 - //此处得到序列化以后的字节,可以再反序列化为DataSet,得到DataSet就可以对个DataSet做处理,删除,修改,
 - //处理完成再把处理完成的DataSet赋值给ServiceData,就可以了
 - //----------------------------
 - #endregion
 - }
 - ICallback callback = OperationContext.Current.GetCallbackChannel
 (); - 此时就会调用客户端的回调函数
 - public class ClientCallBack : ICallback
 - {
 - #region ICallBack 成员
 - //要上传的数据
 - public void getData()
 - {
 - DataSet ds = new DataSet("test");
 - DataTable table = new DataTable("test");
 - DataColumn column = new DataColumn("test");
 - column.DataType = Type.GetType("System.String");
 - table.Columns.Add(column);
 - DataRow row;
 - for (int i = 0; i < 200000; i++)
 - {
 - row = table.NewRow();
 - row["test"] = "Hello";
 - table.Rows.Add(row);
 - }
 - ds.Tables.Add(table);
 - byte_All = KCDataFormatter.GetBinaryFormatDataCompress(ds);
 - }
 - private int i = 1000; //每次读取字节的数量
 - byte[] byte_All;//获取要上传的字节流
 - MemoryStream Mstream;//流
 - public byte[] getBytes(int intNum)
 - {
 - int j = 1000;
 - byte[] buffer;
 - if (intNum < iti)//判断是否是最后一次循环
 - {
 - buffer = new byte[1000];
 - }
 - else
 - {
 - int nn = byte_All.Length - ((iti - 1) * 1000);
 - buffer = new byte[nn];
 - j = nn;
 - }
 - int iold = (i * (intNum - 1));//记录上一次的字节位置
 - Mstream = new MemoryStream();
 - Mstream.Write(byte_All, iold, j);//从byte_All中的第iolld开始写入j(最多不超过)个到内存中
 - buffer = Mstream.ToArray();
 - Mstream.Close();
 - Mstream.Dispose();
 - return buffer;
 - }
 - private int iti = 0;//初始化循环次数
 - public int getTimes()//将数据流分为多少部分
 - {
 - getData();
 - int temp = byte_All.Length / 1000;
 - int intNum = byte_All.Length % 1000 != 0 ? temp + 1 : temp;
 - iti = intNum;
 - return intNum;
 - }
 - #endregion
 - }
 
以上就是我想出来的关于WCF传输数据一部分的代码,希望大家看了会有帮助。