.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();

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

 

 

 

 

 

 

 

 

 

 

posted on 2012-06-02 10:36  chulia  阅读(298)  评论(0)    收藏  举报

导航