1. 什么是取消? #
取消 允许任一方中止 正在进行的请求。例如用户点击「停止」按钮,或客户端/服务器发现请求已超时、不再需要结果时,可发送取消通知。
协议版本 :2025-11-25
通俗理解
说明
可选能力
取消是可选功能,双方协商支持后可用
双向
客户端可取消发给服务器的请求,服务器也可取消发给客户端的请求
通知
通过 notifications/cancelled 通知实现,无需等待响应
2. 本章你将学到 #
如何发送取消通知
取消的规则与限制
时序与竞态条件的处理
错误处理与实现建议
3. 取消流程 #
当一方希望取消进行中的请求时,发送 notifications/cancelled 通知:
{
"jsonrpc" : "2.0" ,
"method" : "notifications/cancelled" ,
"params" : {
"requestId" : "123" ,
"reason" : "User requested cancellation"
}
}
字段
说明
requestId
要取消的请求 ID(必须与先前发出的请求 ID 一致)
reason
可选,取消原因,便于调试或展示给用户
4. 行为要求 #
4.1 发送方 #
规则
说明
仅引用有效请求
只能取消同一方向 发出且仍在进行中 的请求
不得取消 initialize
客户端不得 取消 initialize 请求
任务用专用接口
对于任务 增强请求,必须 使用 tasks/cancel 请求,而非 notifications/cancelled
忽略后续响应
发送取消后,应当 忽略该请求之后到达的任何响应
4.2 接收方 #
规则
说明
停止处理
应当 停止处理已取消的请求,释放相关资源
不发送响应
不得 为已取消的请求发送响应
可忽略的情况
请求 ID 未知、处理已完成、请求无法取消时,可以 忽略取消通知
5. 时序与竞态 #
由于网络延迟,取消通知可能在请求已处理完 甚至响应已发出 之后才到达。双方必须 妥善处理这类竞态:
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Client->>Server: 请求 (ID: 123)
Note over Server: 开始处理
Client->>Server: notifications/cancelled (requestId: 123)
Note over Server: 可能已处理完、已发响应
Note over Server: 若未完成,则停止处理
情况
接收方行为
取消先于完成
停止处理,不发送响应
取消晚于完成
可忽略取消(响应已发出)
请求 ID 未知
可忽略
6. 实现建议 #
建议
说明
记录原因
双方应当 记录取消原因,便于调试
用户提示
应用应当 在请求被取消时向用户提示
7. 错误处理 #
无效的取消通知应当 被忽略,保持「发出即忘」特性:
情况
处理
未知的请求 ID
忽略
已完成的请求
忽略
格式错误的通知
忽略
8. 延伸阅读 #