如何實(shí)現(xiàn)WCF傳輸DataSet功能
那天看了WCF的相關(guān)資料片,就決定如何實(shí)現(xiàn)WCF傳輸DataSet,這個(gè)功能主要是通過(guò)客戶端調(diào)用服務(wù)端的一個(gè)函數(shù),使函數(shù)接受一個(gè)DataSet的參數(shù),然后再返回一個(gè)DataSet,這個(gè)功能很容易,使用幾段代碼就能搞定。
如果WCF傳輸DataSet內(nèi)的數(shù)據(jù)量非常大的時(shí)候,那就麻煩了.(暫不討論傳輸大數(shù)據(jù)量的DataSet是否合理),WCF默認(rèn)最大傳輸數(shù)據(jù)量為64K,當(dāng)然可以實(shí)現(xiàn)修改配置文件來(lái)傳輸大數(shù)據(jù)量,可是不能解決本質(zhì)的問(wèn)題,我目前解決這個(gè)問(wèn)題的方式是。#t#
把一個(gè)WCF傳輸DataSet序列化為一個(gè)字節(jié),然后把這些字節(jié)進(jìn)行壓縮,然后每次發(fā)送一小段字節(jié)回去,接受到這個(gè)些字節(jié)以后然后在解壓縮,再反序列化為為WCF傳輸DataSet這樣就實(shí)現(xiàn)了,傳入一個(gè)WCF傳輸DataSet然后再返回一個(gè)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); //寫(xiě)到內(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); 這里就得到了服務(wù)端返回的DataSet.
getData()函數(shù)內(nèi)可以編寫(xiě)需要上傳的DataSet,我這里是生成20W條記錄.通過(guò)回調(diào)函數(shù)就會(huì)把這20W條數(shù)據(jù)傳入服務(wù)端,回調(diào)結(jié)束了,WCF傳輸DataSet也就傳入了服務(wù)端了.(我這里服務(wù)端沒(méi)有任何處理這個(gè)WCF傳輸DataSet就直接返回這個(gè)WCF傳輸DataSet會(huì)客戶端),客戶端繼續(xù)執(zhí)行他的邏輯,此時(shí)的邏輯是把剛才傳入的服務(wù)端的Dataset再返回給客戶端。