为何WCF中HttpsTransport设WebSocket=Always比Never更快?
以下是几个核心原因,解释你观察到的性能差异:
TLS握手与连接复用的差异
当transportUsage=Never时,WCF使用常规HTTPS传输,若你的请求是频繁的短生命周期调用,且HTTP连接池配置不合理(比如默认连接数限制、连接回收策略),会导致每次请求都重新建立TCP连接并完成TLS握手——这两步的开销(尤其是TLS握手的密钥交换、证书验证)非常高。而WebSocket一旦建立连接后,会保持持久连接,后续所有无会话请求都复用这个已完成TLS握手的连接,彻底避免了重复的握手开销,这是性能差距的主要来源。WCF连接管理的默认行为
WCF的无会话模式在HTTPS传输下,默认可能会在请求结束后立即关闭连接(依赖HTTP的Connection: close头),而WebSocket传输即使是无会话调用,客户端和服务端的连接管理逻辑会默认复用已建立的WebSocket连接,不会每次请求都断开重建。这种复用带来的连接开销节省,远超过WebSocket帧的微小额外开销。消息传输的效率差异
WebSocket在WCF中的消息封装更轻量化:它的帧头开销远小于HTTPS请求的完整HTTP头(包含Host、User-Agent、Content-Type等大量字段)。对于频繁的小请求(比如数据库查询这类单次数据量不大的调用),HTTP头的额外字节开销累计起来会显著拖慢整体速度,而WebSocket的极简帧头能有效减少传输量。潜在的编码优化
若你的绑定配置中,WebSocket传输默认启用了二进制消息编码(BinaryMessageEncodingBindingElement),而HTTPS传输使用了文本编码(比如TextMessageEncoding),二进制编码的序列化/反序列化速度和传输体积都远优于文本编码,这也会进一步拉大性能差距。
内容的提问来源于stack exchange,提问作者saibot75

