日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
利用DataSet實現(xiàn)WCF傳輸數(shù)據(jù)

在網(wǎng)上看了大量關(guān)于WCF相關(guān)的資料,WCF現(xiàn)在是一個強大的技術(shù),然后就產(chǎn)生一個想法.如何實現(xiàn)WCF傳輸數(shù)據(jù),這個服務(wù)的主要功能是客戶端調(diào)用服務(wù)端的一個函數(shù),這個函數(shù)接受一個DataSet的參數(shù),然后再返回一個DataSet,當(dāng)然這個功能很簡單,幾行代碼就搞定了.

創(chuàng)新互聯(lián)長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為乳山企業(yè)提供專業(yè)的網(wǎng)站制作、做網(wǎng)站,乳山網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

#T#可是當(dāng)如果DataSet內(nèi)的數(shù)據(jù)量非常大的時候, 那就麻煩了.(暫不討論傳輸大數(shù)據(jù)量的DataSet是否合理),WCF默認最大傳輸數(shù)據(jù)量為64K,當(dāng)然可以實現(xiàn)修改配置文件來傳輸大數(shù)據(jù)量,可是不能解決本質(zhì)的問題,我目前解決這個問題的方式是,把一個DataSet序列化為一個字節(jié),然后把這些字節(jié)進行壓縮,然后每次發(fā)送一小段字節(jié)回去,接受到這個些字節(jié)以后然后在解壓縮,再反序列化為為DataSet,這樣就實現(xiàn)了,傳入一個DataSet然后再返回一個DataSet,這樣的話,就需要用到 WCF的雙向通信,使用回調(diào)函數(shù),WCF傳輸數(shù)據(jù)代碼如下:

 
 
  1. DuplexChannelFactory channelFactory = new DuplexChannelFactory(new InstanceContext(new ClientCallBack()), "defaultEndpoint");  
  2. IHello getHello = channelFactory.CreateChannel();  
  3. //傳入DataSet到服務(wù)端  
  4. getHello.SayHelloTo();  
  5.  
  6. //首先客戶端調(diào)用服務(wù)端的函數(shù)SayHelloTo(),  
  7. public void SayHelloTo()  
  8. {  
  9. //讀取客戶端傳入的DataSet  
  10. #region 服務(wù)端的數(shù)據(jù)  
  11. ICallback callback = OperationContext.Current.GetCallbackChannel();  
  12.    
  13. int intNum = callback.getTimes() + 1; //獲取讀取字節(jié)流的次數(shù)  
  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);//寫到內(nèi)存中  
  20.  }  
  21. Mstream.Position = 0;  
  22. getbyte = new byte[Mstream.Length];  
  23. Mstream.Read(getbyte, 0, getbyte.Length);//從內(nèi)存中讀到getbyte中  
  24. Mstream.Close();  
  25.  
  26. //反序列化  
  27. ServiceData = KCDataFormatter.RetrieveDataSetDecompress(getbyte);  
  28. //----------------------------  
  29. //此處得到序列化以后的字節(jié),可以再反序列化為DataSet,得到DataSet就可以對個DataSet做處理,刪除,修改,  
  30. //處理完成再把處理完成的DataSet賦值給ServiceData,就可以了  
  31. //----------------------------  
  32. #endregion  
  33. }  
  34. ICallback callback = OperationContext.Current.GetCallbackChannel();  
  35. 此時就會調(diào)用客戶端的回調(diào)函數(shù)  
  36. public class ClientCallBack : ICallback  
  37. {  
  38. #region ICallBack 成員  
  39. //要上傳的數(shù)據(jù)  
  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; //每次讀取字節(jié)的數(shù)量  
  58. byte[] byte_All;//獲取要上傳的字節(jié)流  
  59. MemoryStream Mstream;//流  
  60. public byte[] getBytes(int intNum)  
  61. {  
  62. int j = 1000;  
  63. byte[] buffer;  
  64. if (intNum < iti)//判斷是否是最后一次循環(huán)  
  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));//記錄上一次的字節(jié)位置  
  76. Mstream = new MemoryStream();  
  77. Mstream.Write(byte_All, iold, j);//從byte_All中的第iolld開始寫入j(最多不超過)個到內(nèi)存中  
  78. buffer = Mstream.ToArray();  
  79. Mstream.Close();  
  80. Mstream.Dispose();  
  81. return buffer;  
  82. }  
  83. private int iti = 0;//初始化循環(huán)次數(shù)  
  84. public int getTimes()//將數(shù)據(jù)流分為多少部分  
  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. }  

以上就是我想出來的關(guān)于WCF傳輸數(shù)據(jù)一部分的代碼,希望大家看了會有幫助。


網(wǎng)站欄目:利用DataSet實現(xiàn)WCF傳輸數(shù)據(jù)
文章分享:http://m.5511xx.com/article/dppchig.html