我想取消一个简单的 GET 方法,该方法等待 10 秒并返回一个字符串。它封装在 try-catch 块中。 它可以在 CLI 和 Chrome 中运行,但不能在 Swagger 中运行。
[HttpGet("wait")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public async Task<string> Wait(CancellationToken userCancellationToken)
{
try
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"Waited {i} seconds, CancellationRequested: {userCancellationToken.IsCancellationRequested}");
userCancellationToken.ThrowIfCancellationRequested();
await Task.Delay(1000);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw;
}
return "OK";
}
在 Chrome 中,我通过“停止加载页面”(X - URL 左侧)并关闭选项卡 (
http://localhost:5001/api/wait
) 取消了操作。
在我使用的 CLI 中
curl -X 'GET' \
'http://localhost:5001/wait' \
-H 'accept: application/json'
(swagger本人推荐)
在这两种情况下(CLI 和浏览器)服务器都会打印出:
Waited 0 seconds, CancellationRequested: False
Waited 1 seconds, CancellationRequested: False
Waited 2 seconds, CancellationRequested: False
Waited 3 seconds, CancellationRequested: True
The operation was canceled.
我正在使用最新版本的 Swashbuckle 和
net6.0
:
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.1" />
大摇大摆地取消不会做任何事情(日志打印到最后并且
CancellationRequested: False
,Chrome的网络窗口也显示响应)
您可以在代码中放置断点,执行请求,然后一旦断点命中,刷新 Swagger 页面并在 Visual Studio 中按 F5。这应该会触发请求取消。
如果请求足够慢,您可能甚至不需要断点,只需按“执行”然后按 F5。至少在 Firefox 中为我工作。