如何實現(xiàn)WCF傳輸DataSet功能
那天看了WCF的相關(guān)資料片,就決定如何實現(xiàn)WCF傳輸DataSet,這個功能主要是通過客戶端調(diào)用服務端的一個函數(shù),使函數(shù)接受一個DataSet的參數(shù),然后再返回一個DataSet,這個功能很容易,使用幾段代碼就能搞定。
如果WCF傳輸DataSet內(nèi)的數(shù)據(jù)量非常大的時候,那就麻煩了.(暫不討論傳輸大數(shù)據(jù)量的DataSet是否合理),WCF默認最大傳輸數(shù)據(jù)量為64K,當然可以實現(xiàn)修改配置文件來傳輸大數(shù)據(jù)量,可是不能解決本質(zhì)的問題,我目前解決這個問題的方式是。#t#
把一個WCF傳輸DataSet序列化為一個字節(jié),然后把這些字節(jié)進行壓縮,然后每次發(fā)送一小段字節(jié)回去,接受到這個些字節(jié)以后然后在解壓縮,再反序列化為為WCF傳輸DataSet這樣就實現(xiàn)了,傳入一個WCF傳輸DataSet然后再返回一個DataSet,這樣的話,就需要用到WCF的雙向通信,使用回調(diào)函數(shù)。
- int intNum = getHello.serviceTime() + 1; //獲取讀取字節(jié)流的次數(shù)
- MemoryStream Mstream = new MemoryStream();
- byte[] getbyte;
- for (int i = 1; i < intNum; i++)
- {
- getbyte = getHello.DownByte(i);
- Mstream.Write(getbyte, 0, getbyte.Length); //寫到內(nèi)存中
- }
- Mstream.Position = 0;
- getbyte = new byte[Mstream.Length];
- Mstream.Read(getbyte, 0, getbyte.Length); //從內(nèi)存中讀到getbyte中
- Mstream.Close();
- 反序列化
- DataSet ds = KCDataFormatter.RetrieveDataSetDecompress(getbyte); 這里就得到了服務端返回的DataSet.
getData()函數(shù)內(nèi)可以編寫需要上傳的DataSet,我這里是生成20W條記錄.通過回調(diào)函數(shù)就會把這20W條數(shù)據(jù)傳入服務端,回調(diào)結(jié)束了,WCF傳輸DataSet也就傳入了服務端了.(我這里服務端沒有任何處理這個WCF傳輸DataSet就直接返回這個WCF傳輸DataSet會客戶端),客戶端繼續(xù)執(zhí)行他的邏輯,此時的邏輯是把剛才傳入的服務端的Dataset再返回給客戶端。