JSON 协议
JSON 协议是默认的 hub 协议。每条消息是一个 JSON 对象,以 ASCII 记录分隔符
0x1E 结尾。
消息类型
type | 消息 | 方向 |
|---|---|---|
| 1 | Invocation | 双向 |
| 2 | StreamItem | 双向 |
| 3 | Completion | 双向 |
| 4 | StreamInvocation | 双向 |
| 5 | CancelInvocation | 双向 |
| 6 | Ping | 双向 |
| 7 | Close | 双向 |
| 8 | Ack | 双向(状态化重连) |
| 9 | Sequence | 双向(状态化重连) |
帧形状
每条消息编码为一个 JSON 对象后跟 0x1E:
{"type":1,"target":"Add","arguments":[40,2],"invocationId":"1"}\x1e
选择
connection = HubConnection(protocol="json") # 默认
握手声明协议:
{"protocol": "json", "version": 2}\x1e
协商到状态化重连时发送版本 2;否则发送版本 1,保证老服务器可用。
线上消息示例
调用:
{"type":1,"invocationId":"1","target":"Add","arguments":[40,2]}
StreamItem:
{"type":2,"invocationId":"1","item":0}
带结果的 Completion:
{"type":3,"invocationId":"1","result":42}
Ack:
{"type":8,"sequenceId":7}
Sequence:
{"type":9,"sequenceId":8}
解析器行为
- 未知消息类型被忽略(向前兼容)。
- 缺少必需属性抛
ProtocolError,对连接是致命的。 Completion的error与result属性互斥。0x1E分隔解析是增量的、受大小限制(maximum_receive_message_size, 默认 32 KiB)。