利用DataSet實現WCF傳輸數據
在網上看了大量關于WCF相關的資料,WCF現在是一個強大的技術,然后就產生一個想法.如何實現WCF傳輸數據,這個服務的主要功能是客戶端調用服務端的一個函數,這個函數接受一個DataSet的參數,然后再返回一個DataSet,當然這個功能很簡單,幾行代碼就搞定了.
#T#可是當如果DataSet內的數據量非常大的時候, 那就麻煩了.(暫不討論傳輸大數據量的DataSet是否合理),WCF默認最大傳輸數據量為64K,當然可以實現修改配置文件來傳輸大數據量,可是不能解決本質的問題,我目前解決這個問題的方式是,把一個DataSet序列化為一個字節,然后把這些字節進行壓縮,然后每次發送一小段字節回去,接受到這個些字節以后然后在解壓縮,再反序列化為為DataSet,這樣就實現了,傳入一個DataSet然后再返回一個DataSet,這樣的話,就需要用到 WCF的雙向通信,使用回調函數,WCF傳輸數據代碼如下:
- DuplexChannelFactory<IHello> channelFactory = new DuplexChannelFactory<IHello>(new InstanceContext(new ClientCallBack()), "defaultEndpoint");
- IHello getHello = channelFactory.CreateChannel();
- //傳入DataSet到服務端
- getHello.SayHelloTo();
- //首先客戶端調用服務端的函數SayHelloTo(),
- public void SayHelloTo()
- {
- //讀取客戶端傳入的DataSet
- #region 服務端的數據
- ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
- 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<ICallback>();
- 此時就會調用客戶端的回調函數
- 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傳輸數據一部分的代碼,希望大家看了會有幫助。