【问题标题】:How to read big amount of data in chunks?如何分块读取大量数据?
【发布时间】:2012-10-24 10:42:24
【问题描述】:

我有一个项目,我应该使用外部 WCF 服务,其方法如下:

Items catalogItems = externalClient.getCatalogItems(auth, idCatalog, 1, 100);

调用 getCatalogItems 服务方法后,我应该以这种方式将返回的项目数组转换为原始 SOAP 消息:

Message response = Message.CreateMessage(MessageVersion.Default, ReplyAction_GetCatalogItems, catalogItems);

getCatalogItems 服务方法中的最后两个参数指定每次调用应获取的数据块的大小。例如,如果我们有 1050 条记录,所有这些记录都应该以 100 的块获取 10 次,以 50 的块获取 1 次。

我知道我应该阅读这些数据,直到它们可用。我有两个问题:

  1. 我怎么知道我应该在哪里继续阅读?例如,如果我已经阅读了 100 条记录的第一部分,我如何知道 reader 的当前位置在哪里?

  2. 我怎么知道我什么时候到达终点?

【问题讨论】:

    标签: c# wcf soap chunks


    【解决方案1】:

    一种方法是让客户端负责记住状态(即客户端当前所在的页码)。

    因此,您可以更改方法调用以包含页码和每页参数:

    Items catalogItems = externalClient.getCatalogItems(auth, idCatalog, pageNumber, itemsPerPage);
    

    然后,该服务基本上可以根据 pageNumber 和 itemsPerPage 值选择一组项目,并且它不需要保存状态。 (注意:如果您使用数据库作为项目的存储库,这可以很容易地转换为选择查询)

    您也可以更改返回值以包含项目总数: 示例:

    CatalogResponse respone = externalClient.getCatalogItems(auth, idCatalog, pageNumber, itemsPerPage);
    
    public class CatalogResponse 
    {
       private _totalItems;
       private _items;
    }
    

    这也为客户端提供了灵活性来确定每次调用中要接收的项目块并让最终用户选择页面大小。

    【讨论】:

    • 很遗憾,我无法改变原来的服务方式。
    • 如果您知道项目的总数,那么您可以将其作为客户的责任。只需根据您的客户当前所在的页码确定起始行和结束行。
    • 我已经找到了另一种方法。还是谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多