基於.NET Remoting的多層架構的一個問題:傳輸大量數據的DataSet時,出現
 System.Runtime.Remoting.RemotingException: Server encountered an internal error. For more information, turn off customErrors in the server's .config file.
我做過小小的統計,當我Select Top 10000條記錄或以下時,不會出錯,Select Top 20000就會出錯了。本人認為是傳輸有問題,想壓縮下再傳輸,根據網友zendy的"实现一个压缩Remoting传输数据的Sink:CompressionSink  "(http://www.cnblogs.com/caomao/archive/2005/07/29/202942.html) 卻出現了另一個錯誤:
System.Exception: System.FormatException: Header checksum illegal
  at NZlib.Compression.Inflater.DecodeHeader() in D:\Hoplun\Compression\NZipLib\Compression\Inflater.cs:line 223
  at NZlib.Compression.Inflater.Decode() in D:\Hoplun\Compression\NZipLib\Compression\Inflater.cs:line 397
  at NZlib.Compression.Inflater.Inflate(Byte[] buf, Int32 off, Int32 len) in D:\Hoplun\Compression\NZipLib\Compression\Inflater.cs:line 671
  at NZlib.Streams.InflaterInputStream.Read(Byte[] b, Int32 off, Int32 len) in D:\Hoplun\Compression\NZipLib\Streams\InflaterInputStream.cs:line 271問題從今天上午搞到現在,沒有一點進展,現主要有疑問:
1、cnblogs上的zendy提供的解決方案,是否不能壓縮DataSet?因為我使用Zendy提供的Demo,將其如我專案的一樣,將Remoting配置在IIS當中,也可以成功運行。所以有此懷疑。
2、如果要在Remoting中壓縮傳輸DataSet,應該如何做?注意項目很快就要上線使用,不可能再重寫一個擴展DataSet之類的啦!
3、我剛開始大於10000的數據就出錯的問題,是否真如我想的錯誤原因?
4、哪位兄弟姐妹有好的解決方案,能否告知一下。不勝感激!分數不夠的話,另開貼奉上。

解决方案 »

  1.   


    不知是這個問題太簡單了還是什么原因,CSDN上的高手不屑於出手嗎?自己再頂,等高手出現。能夠給點分析也好啊。
      

  2.   


    終於有兩位出來說話了。高人難等啊.......上面兩位是理想狀態,我現在的情況是,頁面上有一個查詢按鈕,是按條件來查詢的,如果什么條件都不輸的話,是希望全部顯示,而全部顯示出來的數據就有10多萬條。以致於出錯啦。當然,選擇條件顯示自然不會出錯嘍。不過,yan63(silence like a cancer grows)的意思,是否直接在數據庫中就分好頁,再傳輸?能否說詳細點,或者直接給個代碼說明......
      

  3.   

    你的带宽可能太小。。
    不传dataset,去掉Schema存成xml
    接收用dataset读。
      

  4.   

    希望全部顯示,而全部顯示出來的數據就有10多萬條
    ---------------------------------------
    就算是winform,也没有这么显示数据的做法,如果是webform,那服务器的负载更是可观,对于用户,估计得有上百只蜻蜓的复眼。
    搜一下csdn上大数据量分页显示的帖子,很多的
    像你说的这种情况,返回记录集的前10-15条就可以了,更多的数据可以在用户翻页的时候再传
    zip的压缩,对xml等文本类文件的压缩比较理想,对二进制作用不大(相对)
      

  5.   

    1 不要传dataset,把数据提取到逻辑层对象直接传
    2 数据量大的话,逻辑层和web service都要做分页
      

  6.   

    看來多數人贊成分頁顯示,我也試過了,即使數據量很,壓縮這個DataSet也會出錯。為什么?
    還是說如果數據量較小的話,干脆不壓縮還好一些?
      

  7.   

    也就是壓縮出現System.Exception: System.FormatException: Header checksum illegal的錯誤是怎麼回事?如何解決?
      

  8.   

    如果是webform,建议用DataReader逐条读取,然后自己控制格式化输出
      

  9.   

    remoting使用二进制对象,没必要xml序列化,文本压缩什么的。分页的话不值得为一点点带宽牺牲cpu时间
      

  10.   

    yan63(silence like a cancer grows) 
    講得有道理,兄臺似乎也對Remoting深有研究,能否留下聯系方式,交流一下。
      

  11.   

    不要用Remoting效率极其低下无论是二进制的还是Http的,只要返回的行数一多,肯定就不行(我以前在我的C/s程序做过实验),还是直接传DataSet吧,你就感到速度会提升一个数量级的
      

  12.   

    @shinaterry(簡簡⿺單單..) 因為我在頁面使用一個GridView,并給它綁定了一個objectDataSource,讓GridViw自動分頁,所以....才。@whmjw(明年今日十年之后) 
    呵呵..
      

  13.   

    楼上的看法都没有错误,但是楼主是项目要上马了,没时间改了。先解决传输问题,如果压缩有问题,就先不要压缩,试试看在传输DataSet之前,将DataSet分解一下,每次读1000条数据,分次传输,每次传输一部分,客户端接收到了以后,再组合起来。
      

  14.   

    ezhuyin(碧海蓝天) 
    是top N之類嗎?
    將DataSet分解?分次傳輸?客戶端再組合?
    沒有很看懂?可否詳細點?
      

  15.   

    remoting传递数据要用二进制,另个数据也应该做个分页来传送
      

  16.   

    @nic7968(得不到的往往是最差)
    我傳遞的數據是用的二進制,只是分頁的時候,我直接用的gridview,邦定objectDataSource。分頁傳送,如今似乎改動太大的了。不是嗎?
    或者兄弟有沒有現成demo學習借劍下。
      

  17.   

    数据10000以上 Remoting 受的了吧,呵呵,压缩也是需要时间的,还有解压缩估计是你的程序问题
      

  18.   

    @wuxing2006(金宝)
    呵呵。
    確實可以傳輸過來15000條左右,但速度是“驚人的”,不敢這樣子。@ttjacky(豆豆糖)
    沒辦法,剛開始是不顯示一條記錄,被用戶發現說不能這樣子。呵呵.......
      

  19.   

    压缩是一个解决的办法,不知道LZ所采用的压缩方法或类库是什么,我曾经用ICSharpCode.SharpZipLib对DataSet进行压缩,经过实验,数据压缩的比例在1:10到1:6之间,对大数量传输的作用是相当明显的。到目前为止,尚未发现压缩和解压出现问题。
      

  20.   

    @Bote_China()
    我使用的是NZipLib出現問題,后下載了7z組件,也出現問題。
    直到如今,這種辦法看來是行不通的,所以我已改用分頁傳輸了。如果你真壓縮成功過,給我一個demo,行嗎?我再看看,謝謝![email protected]
      

  21.   

    如果确定是使用压缩组件压缩中出现的问题,可以参考一下
    http://blog.csdn.net/zlc810821/archive/2005/02/25/301855.aspx
    或类似的文章,很多的
    如果在本地调用没有问题,再考虑部署到remoting环境中。
    前提是你先把dataset序列化为xml文本...(-_#)或者考虑一下其他二进制压缩的算法
      

  22.   

    ICSharpCode.Sharp
    支持用这个。是在自定义层压缩加密
    至于DataSet能否压缩。其实不是这么区分的。序列化地都可以。里面其实是在formatter之后进行的自定义处理。处理的是流。所以只要能序列话的。至于是什么不重要吧。
      

  23.   

    jinliangliu(KingNa) ( ) 信誉:100  2007-7-25 19:47:50  得分: 0  @ttjacky(豆豆糖)
    沒辦法,剛開始是不顯示一條記錄,被用戶發現說不能這樣子。呵呵.......
      
    你可以显示呀,但也别显示1W条啊,100条就够了。 
      

  24.   

    数据量大的话可以试一试用支持virtual load的datagridview等来处理.一直在研究remoting...http://csla.blog.sohu.com/