【问题标题】:Streaming an undetermined number of objects through WCF通过 WCF 流式传输不确定数量的对象
【发布时间】:2011-04-05 09:54:10
【问题描述】:

我有一个 WCF 服务需要从数据库中读取大量(10 到 2000 万)个对象。

我想做的是让客户端打开一个流并让服务器在读取时从数据库推送数据。

因此,客户端可以按照 Twitter 流 API 的样式,但具有有限集,只需要在一个循环中反序列化消息,直到它从服务器获取 EOF 消息。我遇到的问题是如何返回流然后继续写入它。 WCF 可以做到这一点吗?

【问题讨论】:

    标签: c# wcf streaming


    【解决方案1】:

    不如使用WS Dual Http 之类的东西来代替设置流式传输/阻止服务。有了它,您就有了一个异步双向回调通道,允许您在服务器和客户端之间来回请求/回复信息。如果您想流式传输整个集合,您可能会看到的问题是一种正常方式,即某些资源可能会阻止其他请求(或超时),而其他用户尝试访问该服务。

    【讨论】:

    • WS Dual Http 根本不允许流式传输。但通常你是对的。在 WCF 中模拟这种通信的唯一方法可能是打开双向流式 Net.TCP 连接(不确定这种组合是否可行)。使用客户端回调而不是返回单个流来发送数据集。
    • 我没有说它允许流式传输。我想说这可能是比流媒体更好的选择。您可以在 WCF 中进行流式传输,但它会阻止其他传入请求的 I/O。在缩放方面,这不是一个好的选择。此外,大多数内置序列化程序都希望在开始反序列化内容之前下载整个消息。
    • 使用 HttpHandler 并以这种方式写入流会更好吗?我需要通过 HTTP,因为这是一个外部 Web 服务。看看你的解决方案马特,它看起来不错,但我忘了提到我们可能有人从 WCF 外部使用它,所以我猜我必须走 HttpHandler 路线?我不一定与 WCF 相关,只是想知道这是否可能,所以如果有其他更好的选择,我当然愿意接受。感谢您抽出宝贵时间回答我的问题。
    • 您能否详细描述 WCF 在使用流式处理时如何阻止 I/O?你有什么链接可以让我了解更多关于这种行为的信息吗?
    【解决方案2】:

    问题是 WCF 不提供操作的响应流。从操作返回的流只是一些消息的“内容”。我试图用一些线程场景来欺骗 WCF,在这些场景中我返回 MemoryStream 并尝试从其他线程填充它,但正如预期的那样它不起作用。

    提到 HttpHandler 是唯一的出路。

    【讨论】:

      【解决方案3】:

      您可能想看看PollingDuplexHttpBinding(通知id 可能可能 :-))。

      有些人不太喜欢这种绑定,但在完成正确配置的最初障碍之后,我并没有遇到太多麻烦。

      它当然可以完成我认为的工作,因为据我所知,它只不过是网络套接字中使用的“长轮询技巧”。

      HTH。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-16
        • 2018-03-06
        • 2013-04-27
        • 2012-04-29
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多