以流式方式生成大型Feed

时间:2011-12-21 21:21:22

标签: wcf-data-services odata

我应该实现OData服务,它将能够以流方式生成feed ie - 当服务仍然生成下一个条目时,客户端应该开始读取提要的第一个条目。

WCF数据服务是否可以实现此类行为?

现在我无法做到这样的行为 - 服务首先在缓冲区中生成整个Feed,然后才启动 将它转移到客户端但这种行为不适合我,因为它太大而无法在缓冲区中生成 它不包含很多行的BLOB属性,因此IDataServiceMetadataProvider的实现将无济于事。

2 个答案:

答案 0 :(得分:0)

我认为这是不可能的。 WCF服务(以及WCF数据服务)提供流,但流支持不基于通信两端的并发写入和读取。例如,如果您在磁盘上有文件并将其流传递到WCF通道进行发送,则流式传输效果很好。

问题在于如何构建WCF。您不会在服务操作中获得传输流,这是问题的全部来源。您必须启动一些新流或打开另一个现有流,并且只有在从操作返回此流后,它才会传递到底层WCF基础结构并复制到传输流。但这意味着在从服务操作返回之前必须准备流(包含所有数据)。

我尝试构建服务,在从操作返回后从另一个线程连续填充流,但它根本不起作用。

答案 1 :(得分:0)

我只能通过允许WCF流来解决这个问题 - 指定transferMode =“Streamed”:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <services>
    <service name="ODataDemo.OdataDemoDataService">
      <endpoint bindingConfiguration="msgSize" address="" binding="webHttpBinding" contract="System.Data.Services.IRequestHandler" />
    </service>
  </services>
  <bindings>
    <webHttpBinding>       
      <binding name="msgSize" transferMode="Streamed" />
    </webHttpBinding>
  </bindings>
</system.serviceModel>