我已经阅读了很多有关取消令牌的内容,并做了一些使用它们的操作,但我仍然觉得我错过了更大的图景。
背景:
客户端:React、TypeScript 服务器:.NET、C# 我将 CancellationToken 添加到从服务器向客户端公开的 API 的签名中,如下所示:
[HttpPost("my-api")] 公共异步任务MyApiMethod(字符串inputVariable1,CancellationToken取消令牌)
当我这样做时,API 的工作方式与没有 CancellationToken 时的工作方式相同。我传播令牌,直到调用 httpClient.SendAsync 并将令牌也传递到那里。理论上,这应该可以处理取消。但我并不完全确定我做得是否正确。
问题:
1- 谁创建和管理我添加到 API 签名中的 CancellationToken?它是如何实例化的以及使用什么参数?
2- 服务器如何检测客户端的请求已被取消?我读到,当客户端和服务器之间的连接关闭时,服务器会执行某些操作。究竟发生了什么以及如何发生?
3-此机制仅用于在浏览器关闭时处理取消吗?如果我想主动取消使用同一键发送两次的请求该怎么办(例如,如果用户在同一按钮上按两次,我希望第二次单击中止已开始的第一项工作。
非常感谢!
整个画面我不太清楚。
向控制器方法添加
CancellationToken
是可选的,但如果您这样做,ASP.NET 将为您处理它,并在请求取消时自动取消它。 (考虑this答案来决定何时使用它。)
当 TCP 连接终止,或者服务器收到
FIN
或 RST
包时。
两者都有。您可以使用AbortController主动取消请求。然而,在这种特定情况下,您的行为并不总是理想的。首先避免双击(例如,在操作完成之前禁用按钮),或者使操作具有幂等性(或两者兼而有之)。您仍然可以取消之前的操作作为优化,但请记住它可能已经在服务器上完成了。