【问题标题】:How to 'Stream' large data using WCF 4.5 WebSockets如何使用 WCF 4.5 WebSockets“流式传输”大数据
【发布时间】:2012-04-16 14:02:54
【问题描述】:

我正在研究新的 WCF 4.5 Websocket 服务。 通过浏览器调用服务时遇到问题。

事实证明(经过大量谷歌搜索后),当您将 Web 浏览器作为 Web 套接字的客户端处理时,WCF 4.5 的唯一工作方式是,如果您定义了 OperationContract 带有 'Action="*"' tag [因为没有从浏览器调用“特定”函数的明确方法,您可以调用 'ws .send("asd")' 向服务器发送消息,因此您需要为所有传入的服务调用定义一个处理程序,同样只能有一个回调函数]

现在,如果您使用 'Action="*"',则在定义合同时只能使用数据类型 'Message'。

这很好,如果你想创建一个回显服务器,但是假设你想上传/下载数据,在默认(缓冲)模式下,数据传输速度不是他们应该的(20mb 文件需要 40-50 秒)。提高速度的唯一方法是将模式设置为“Streamed”(我尝试使用“StreamResponse”)。

但现在的问题是,由于我们在定义 Contracts 时只能使用 'Message' 作为数据类型,而 Message 使用 SOAP 类型定义,它使用'Buffered' 模式,即使它以其他方式明确定义。 [如果我在这里错了请纠正我]

所以,我的问题是,有什么方法可以在 WCF 4.5 Websockets 中实现“流式数据传输”。

而且,是的,我正在使用 byteStreamMessageEncoding(4.5 中提供的最新版本)。 我在 web.config 中使用“自定义绑定”,因为“netHttpBinding”不适用于浏览器。

【问题讨论】:

  • WebSockets 对消息进行分帧,它是基于消息的协议而不是基于流的协议,即使它实际上是基于 TCP 层(基于流)。每个 WebSocket 消息都有自己的框架,因此由于需要为每个消息设置框架,因此发送流数据的能力不足。并且在接收到整个消息之前不会触发浏览器中的 onmessage 事件。消息的大小在基于 RFC 6455 tools.ietf.org/html/rfc6455#page-27 的框架中定义
  • 您好马克西姆斯,感谢您的回复。
  • 不过,另一个问题,我也研究了 websockets 的 node.js 实现,在 WCF 失败后,最初我得到了相同的数字(25MB 文件的数据传输时间约为 55 秒),但是当我改变时文件读取方法,数字发生了巨大变化,因此即使“websocket”本身是一个基于消息的协议,与普通的 WCF 服务相比,也可以更快地传输大数据。

标签: wcf stream websocket


【解决方案1】:

哦…… 由于 WCF 不起作用..发现它可以使用 ASP.Net 4.5 处理程序来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多