从WCF中获取大块列表<t>?</t>

时间:2011-04-11 09:38:06

标签: c# wcf

我正在尝试从WCF服务获取实体列表,我遇到的问题是我们在网络上有一些不良延迟,因此数据需要相当长的时间才能到达我的客户端。我的想法是找到一种方法来获得前1000个,并在我等待下一个到达时将它们推送到UI。

我想这会像分页一样,但我只是想在WCF层中分页整套,而不是一次从db获取一页

干杯

3 个答案:

答案 0 :(得分:6)

在将消息交给更高级别之前,WCF会完整地查看该消息。因此,您的数据需要完整到达,通常的WCF合同将无效。

但是,您可以使用streaming with WCF。这允许有效载荷从流中逐渐读取并传递到更高级别。为了使其正常运行,您需要:

  • 启用流式传输(在我提供的link中)
  • 更改服务合同以提供流
  • 在服务器端,开始序列化实体并写入流,可能是100个块。您需要自己序列化实体,尽管使用DataContractSerializer我们的方法非常简单。
  • 您需要在这100个实体中的每一个之间提供分隔符,以便您的流程可以找到当前100完成的位置。一种可能的选择是1 KB的字节零。
  • 在客户端,实现Async功能。继续从缓冲区中读取流(例如4KB),直到达到分隔符。一旦命中,反序列化并引发异步事件。

这将更复杂 WCF直接开箱即用,但可以满足您的需求。

答案 1 :(得分:3)

您始终可以将服务界面拆分为两种方法。例如,而不是:

List<T> GetItems()

你可以:

int GetItemCount()

List<T> GetItems(int start, int maxSize)

这样您就可以手动实现分页。

答案 2 :(得分:0)

最后因为我正在使用tcpTransport进行通信,所以我最终使用双工通道来完成我需要的工作。

我所做的只是改变我当前的SearchMethod,它返回一个大的列表为void。在这个方法中,我从数据库中获取数据,将其分块并通过回调操作将其发送到客户端