zoukankan      html  css  js  c++  java
  • .net 2.0远程传输数据集的优化方法

    http://dev.yesky.com/217/30971717.shtml

     在很困惑的情况下查找解决办法,发现可以把dataset压缩一下在传输。在.Net2.0下,dataset已经添加了一个新属性……

      之前碰到一个问题,当我向Remoting传送一个强类型的dataset(其数据量有9000条)时,出现如下错误信息:

      Message: System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine

      at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)

      at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)

      我首先想可能是dataset数据量大,传送超时或者超出了设定的数据量,但是我在web.config里把executionTimeout和maxRequestLength设的都很大的情况下,错误依旧。我发现从传送dataset开始到出现错误,并不是很长时间,所以我想可能不是超时的原因。跟踪调试,发现好像跟dataset的序列化有关系。

      在很困惑的情况下查找解决办法,发现可以把dataset压缩一下在传输。在.Net2.0下,dataset已经添加了一个新属性RemotingFormat,是采用另外一种压缩的(传说中的net1.x时期开源的微软提供的解决方案DataSetSurrogate类)。于是试了下,设置RemotingFormat = SerializationFormat.Binary;

      再序列化,通过Remoting传输,接收后再反序列化,成功更新了数据,错误没有再出现。发现不仅网络传输效果明显,即使本机,性能改善也非常可观。

      下面是我在客户端序列化dataset和在Remoting端反序列化的代码:

      1. 客户端把dataset序列化为二进制格式

      以下是代码片段:

      byte[] bArrayResult = null;

      ds.RemotingFormat = SerializationFormat.Binary;

      MemoryStream ms = new MemoryStream();

      IFormatter bf = new BinaryFormatter();

      bf.Serialize(ms, ds);

      bArrayResult = ms.ToArray();

      ms.Close();

      2. Remoting端接收到byte[]格式的数据bResult,对其进行反序列化,得到数据集ds

      MemoryStream ms = new MemoryStream(bResult);

      IFormatter bf = new BinaryFormatter();

      object obj = bf.Deserialize(ms);

      RevenueCodeDataSet ds = (RevenueCodeDataSet)obj;

      ms.Close();

      碰到的错误,暂且这样解决了,其实自己对为什么出现这个错误还是有困惑。

  • 相关阅读:
    What are the difference between DDL, DML and DCL commands?
    Dingjun123 :使用Partitioned Outer Join实现稠化报表
    Oracle Clusters
    Google实验室能力倾向测试(第一题及解答)
    搜索系统中基于字典的逆向中文分词
    vc++ 深入浅出 窗口创建过程
    计算机网络基础知识1
    线性代数学习之对称矩阵与矩阵的SVD分解
    珍爱生命
    str2hash
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/2531668.html
Copyright © 2011-2022 走看看