.NET Core使用 CancellationToken 取消API请求的操作方法
您是否曾经访问过一个网站,它需要很长时间加载,最终你敲击 F5 重新加载页面。
即使用户刷新了浏览器取消了原始请求,而对于服务器来说,API也不会知道它正在计算的值将在结束时被丢弃,刷新五次,服务器将触发 5 个请求。
为了解决这个问题,ASP.NET Core 为 Web 服务器提供了一种机制,就是CancellationToken.
用户取消请求时,你可以使用HttpContext.RequestAborted访问,您也可以使用依赖注入将其自动注入到您的操作中。
长时间运行的任务请求
现在我们假设您有一个 API 操作,在向用户发送响应之前可能需要一些时间才能完成。
在处理该操作时,用户可以直接取消请求,或刷新页面(这会有效地取消原始请求,并启动新请求)。
[HttpGet(Name = "get")] public async TaskGetAsync() { try { _logger.LogInformation("request in"); await Task.Delay(5 * 1000); _logger.LogInformation("request end"); } catch (Exception ex) { _logger.LogInformation("request ex"); } return "ok"; }
如果用户在请求中途刷新浏览器,那么浏览器永远不会收到第一个请求的响应,但在server端可以看到,操作方法执行完成两次。

这是否是正确将取决于您的应用程序。
如果请求修改某些业务的状态,那么您可能不希望在方法中途停止执行。如果请求没有副作用,那么您可能希望尽快停止(可能很昂贵)操作。
用户取消请求时,你可以使用HttpContext.RequestAborted访问,您也可以使用依赖注入将其自动注入到您的操作中。
CancellationTokens取消不必要的请求
以下代码显示了如何通过将CancellationTokenSource 注入到操作方法中,并通过其取消不必要的操作。
[HttpGet(Name = "get")] public async TaskGetAsync(CancellationToken cancellationToken) { try { _logger.LogInformation("request in"); await Task.Delay(5 * 1000,cancellationToken); _logger.LogInformation("request end"); } catch (Exception ex) { _logger.LogInformation("request ex"); } return "ok"; }
通过这个改变,我们可以再次测试我们的场景。
我们发出一个初始请求,然后我们重新加载页面。正如您从下面的日志中看到的,第一个请求不会继续执行。

用户刷新浏览器取消请求后不久,原始请求就会中止,并TaskCancelledException通过 API 过滤器管道传播回来,并备份中间件管道。
根据您的场景,您可能能够依靠此类框架方法来检查 的状态CancellationToken,或者您可能需要自己监视取消请求。
过滤器捕获异常
您可以通过以上try catch 捕获,或者通过一个过滤器统一监视此异常。
public class OperationCancelledExceptionFilter : ExceptionFilterAttribute
{
private readonly ILogger _logger;
public OperationCancelledExceptionFilter(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger();
}
public override void OnException(ExceptionContext context)
{
if (context.Exception is OperationCanceledException)
{
_logger.LogInformation("Request was cancelled");
context.ExceptionHandled = true;
context.Result = new StatusCodeResult(400);
}
}
}
builder.Services.AddControllers(options =>
{
options.Filters.Add();
}); 
到此这篇关于.NET Core使用 CancellationToken 取消API请求的文章就介绍到这了,更多相关.NET Core取消API请求内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!
上一篇:详解如何在.NET代码中使用本地部署的Deepseek语言模型
栏 目:ASP.NET
下一篇:.Net Core 使用 TagProvider 与 Enricher 丰富日志的操作代码
本文标题:.NET Core使用 CancellationToken 取消API请求的操作方法
本文地址:https://www.fushidao.cc/wangluobiancheng/3216.html
您可能感兴趣的文章
- 01-28asp.net连接数据库时,有哪些最佳实践和常见问题需要注意?
- 01-28在ASP中实现页面跳转,有哪些方法或代码示例可以弹出一个新页面?
- 01-28如何高效关闭asp.net页面并避免页面刷新或跳转?
- 01-28如何在 ASP.NET 中实现关闭当前页面的操作技巧探讨?
- 01-28asp.net 中实现弹出对话框的最佳实践与代码示例是什么?
- 01-28ASP中实现页面跳转的正确方法是什么?如何优雅地弹出一个新页面?
- 01-28asp.net 调用存储过程时遇到哪些常见问题及解决方法?
- 01-28如何通过ASP高效连接和操作SQL数据库,实现数据交互?
- 01-28ASP.NET下载文件时遇到问题?揭秘高效文件下载技巧与常见难题解决方法!
- 01-28asp.net下载文件时,哪种方法最简便高效?如何确保文件下载过程安全可靠?
阅读排行
- 1asp.net连接数据库时,有哪些最佳实践和常见问题需要注意?
- 2在ASP中实现页面跳转,有哪些方法或代码示例可以弹出一个新页面?
- 3如何高效关闭asp.net页面并避免页面刷新或跳转?
- 4如何在 ASP.NET 中实现关闭当前页面的操作技巧探讨?
- 5asp.net 中实现弹出对话框的最佳实践与代码示例是什么?
- 6ASP中实现页面跳转的正确方法是什么?如何优雅地弹出一个新页面?
- 7asp.net 调用存储过程时遇到哪些常见问题及解决方法?
- 8如何通过ASP高效连接和操作SQL数据库,实现数据交互?
- 9ASP.NET下载文件时遇到问题?揭秘高效文件下载技巧与常见难题解决方法!
- 10asp.net下载文件时,哪种方法最简便高效?如何确保文件下载过程安全可靠?
推荐教程
- 07-25在 .NET 中 使用 ANTLR4构建语法分析器的方法
- 07-25ASP.NET中Onclick与OnClientClick遇到的问题
- 07-25ASP.NET Core 模型验证消息的本地化新姿势详解
- 07-25Asp.NET Core WebApi 配置文件详细说明
- 07-25Math.NET Numerics 开源数学库安装使用详解
- 09-13asp.NET是前端还是后端
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 07-25.NET Core 实现缓存的预热的方式
- 07-25.NET根据文件的哈希值筛选重复文件的实现思路
- 07-25.NET 中的深拷贝实现方法详解
