流消息传输
Windows Communication Foundation (WCF) 传输机制支持两种消息传输模式:
缓冲传输将整个消息保留在内存缓冲区中,直到传输完成。必须完整传递缓冲的消息,接收方才能读取该消息。
流传输以流的形式公开消息。接收方在消息完整传递之前即可开始处理消息。
流传输消除了对大型内存缓冲区的要求,从而提高了服务的可伸缩性。更改传输模式是否能够提高可伸缩性取决于所传输的消息大小。消息大小越大,使用流传输越有利。
默认情况下,HTTP、TCP/IP 和命名管道传输协议使用缓冲传输。本文档介绍如何将这些传输协议从缓冲传输模式切换到流传输模式以及这样做的结果。
启用流传输
在缓冲和流传输模式之间进行选择是在传输协议的绑定元素上完成的。该绑定元素具有一个 TransferMode 属性,该属性可以设置为 Buffered, Streamed、StreamedRequest 或 StreamedResponse。将传输模式设置为 Streamed 将在两个方向上启用流通信。将传输模式设置为 StreamedRequest 或 StreamedResponse 将仅在指示的方向上启用流通信。
BasicHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 绑定公开了 TransferMode 属性。对于其他传输协议,必须创建一个自定义绑定来设置传输模式。
使用缓冲传输还是流传输是在终结点本地决定的。对于 HTTP 传输协议,传输模式不会跨连接传播,也不会传播到服务器和其他中介。设置该传输模式的操作不会反映在服务接口的说明中。在为服务生成一个客户端类后,必须为准备用于流传输的服务编辑配置文件,以设置该传输模式。对于 TCP 和命名管道传输协议,该传输模式将作为策略断言传播。
有关代码示例,请参见如何:启用流处理。
流传输的限制
使用流传输模式会导致运行库实施附加限制。
在整个流传输中发生的操作最多只能与一个输入或输出参数之间具有协定。该参数对应于整个消息正文,并且必须为 Message、Stream 的派生类型或 IXmlSerializable 实现。具有某个操作的返回值等效于具有一个输出参数。
某些 WCF 功能(例如,可靠消息、事务和 SOAP 消息级安全)依赖于缓冲消息以便进行传输。使用这些功能可能减小或消除通过使用流获得的性能好处。若要保证流传输的安全,请只使用传输级安全,或者使用传输级安全外加仅进行身份验证的消息安全。
即使传输模式设置为流模式,SOAP 标头也总是被缓冲。消息的标头不得超出 MaxBufferSize 传输配额的大小。有关此设置的更多信息,请参见传输配额。
缓冲传输和流传输之间的差异
将传输模式从缓冲模式更改为流模式还会更改 TCP 和命名管道传输协议的本机通道形状。对于缓冲传输模式,本机通道形状为 IDuplexSessionChannel。对于流传输模式,本机通道为 IRequestChannel 和 IReplyChannel。在直接(即,不是通过服务协定)使用这些传输协议的现有应用程序中更改传输模式需要更改通道工厂和侦听器的预期通道形状。