在客户端和服务器上使用只有流[messagebodymember]的messagecontract(以及作为[messageheader]发送的任何其他元数据)的流绑定配置,可以让您在一次调用中完成整个操作,而不必担心分页(只需使用服务器端的枚举器来提供流并将单个实体作为ey出现在客户机上),但您必须在流中滚动自己的帧(例如,使用DataContractSerializer或其他方法在流上手动序列化/反序列化实体)。我做过,效果很好,但有点疼。
如果要进行分页,最简单的方法是将sessionful wcf通道与快照事务结合使用(如果您使用的是SQL Server或其他支持它们的实体源)。在第一个请求上启动快照tx,然后将tx的生命周期绑定到会话,这样您就可以看到页面请求之间的数据的稳定图片-会话关闭时(或者如果客户端意外断开连接,则超时),将释放tx。然后,客户机请求它看到的最后一个键值+它需要多少记录(注意maxReceivedMessageSize-留出大量空间)。因为您在快照中,所以不必担心更改——在转储期间,您将看到一个一致的视图。如果你不能快照你的源数据来防止它在下载过程中发生变化,那么生活就更困难了。总是可行的,但是为它设计是非常具体的数据。