当前位置:编程学习 > C#/ASP.NET >>

Remoting返回超大DataSet报Out of Memory问题,WCF的流传输可否解决?

我这里有一实现要由Client端通过Remoting  TCP CHANNEL 取大量的数量, 可能有几百MB, 现在是通过Remoting由数据库提取资料到DataSet后直接返回,但是由于服务端的内存是有限的, 且目前发现好像是BinaryFormat序列化的问题, 导致数据只要比较大, 就会报'System.OutOfMemoryException'的错误,DataSet的 RemotingFormat已是Binary的.
查过一些贴子,好像微软一直没有解决此问题, 如下所示

我的问题是我看在WCF中已有大数据量的Stream传输的功能, Remoting中有类似功能吗?
另外, 如果用WCF的Stream功能传输,我看Sample时由一个FileStream中返回, 如果我想直接由数据库中读数据按Stream返回该如何做?  我自己试了一下是用DataSet的WriteXml写到服务端硬盘, 再用FileStream读取返回给client,但这样好像数据还是一次先要取到DataSet里, 有没有可能由数据库一边取一边返回给Client ? 


 Server stack trace: at System.Runtime.Serialization.ObjectIDGenerator.Rehash() at System.Runtime.Serialization.ObjectIDGenerator.GetId(Object obj, Boolean& firstTime) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.InternalGetId(Object obj, Boolean assignUniqueIdToValueType, Type type, Boolean& isNew) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteKnownValueClass(NameInfo memberNameInfo, NameInfo typeNameInfo, Object data) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArrayMember(WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, Object data) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack sinkStack, IMessage msg, ITransportHeaders& headers, Stream& stream) at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at  --------------------编程问答-------------------- 切割数据,分块传输,数据组合 --------------------编程问答-------------------- 切割数据,分块传输,有REMOTING的范例代码吗?谢谢,现在不知道该如何实现
--------------------编程问答-------------------- 压缩dataset数据传递或序列化数据,通过二进制传递数据
也可使用SOA方式
--------------------编程问答-------------------- 一倏SQL就可以搞定分頁,每次只拿一頁,上網搜一下 --------------------编程问答-------------------- 用户有这个需求,可我总不能说由于技术问题,微软不给你取,哈哈!
看来只能通过SQL分页多次取了 --------------------编程问答-------------------- BinaryFormat还继续报OOM的话,那就没办法了

分批取吧 --------------------编程问答-------------------- Remoting可以用MarshalByRef的方式传递一个大对象,这样仅仅传递过去一个引用
但是DataSet是MarshalByValue的,lz不妨自己定义一个MarshalByRef的对象,而不是用现成DataSet
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,