.NET Core使用 CancellationToken 取消API请求的操作方法

 更新时间:2024年03月18日 08:54:54   作者:hester·chen  
用户取消请求时,你可以使用HttpContext.RequestAborted访问,您也可以使用依赖注入将其自动注入到您的操作中,这篇文章主要介绍了.NET Core使用 CancellationToken 取消API请求,需要的朋友可以参考下

您是否曾经访问过一个网站,它需要很长时间加载,最终你敲击 F5 重新加载页面。

即使用户刷新了浏览器取消了原始请求,而对于服务器来说,API也不会知道它正在计算的值将在结束时被丢弃,刷新五次,服务器将触发 5 个请求。

为了解决这个问题,ASP.NET Core 为 Web 服务器提供了一种机制,就是CancellationToken.

用户取消请求时,你可以使用HttpContext.RequestAborted访问,您也可以使用依赖注入将其自动注入到您的操作中。

长时间运行的任务请求

现在我们假设您有一个 API 操作,在向用户发送响应之前可能需要一些时间才能完成。

在处理该操作时,用户可以直接取消请求,或刷新页面(这会有效地取消原始请求,并启动新请求)。

[HttpGet(Name = "get")]
public async Task<string> GetAsync()
{
    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 Task<string> GetAsync(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<OperationCancelledExceptionFilter>();
    }
    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<OperationCancelledExceptionFilter>();
});

到此这篇关于.NET Core使用 CancellationToken 取消API请求的文章就介绍到这了,更多相关.NET Core取消API请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Asp.net利用JQuery弹出层加载数据代码

    Asp.net利用JQuery弹出层加载数据代码

    最近看QQ空间里面的投票功能很使用。点击一个链接就弹出一个层,然后再加载一些投票信息,旁边的区域变成灰色不可用状态。其实这不算什么高深的技术,只要在ASP.NET中利用JQuery结合一般处理程序ASHX即可搞定了。
    2009-11-11
  • .NET 6开发TodoList应用之请求日志组件HttpLogging介绍

    .NET 6开发TodoList应用之请求日志组件HttpLogging介绍

    这篇文章介绍了.NET 6开发TodoList应用之请求日志组件HttpLogging,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • MvcPager分页控件使用注意事项

    MvcPager分页控件使用注意事项

    这篇文章主要为大家详细介绍了MvcPager分页控件使用的注意事项,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Server.Transfer,Response.Redirect的区别

    Server.Transfer,Response.Redirect的区别

    Server.Transfer,Response.Redirect的区别...
    2006-12-12
  • .Net8.0 WebApi发布到IIS详细步骤

    .Net8.0 WebApi发布到IIS详细步骤

    本文主要介绍了.Net8.0 WebApi发布到IIS详细步骤, 文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 如何禁止文本框的记忆功能方法集锦

    如何禁止文本框的记忆功能方法集锦

    IE提供了一个自动完成功能可以记忆我们的输入内容(如帐号等),方便下一次快速地录入类似资料.这确实是一个非常友好的功能, 在操作时只需用鼠标双击文本框或输入前几个字符, 系统会自动列出以前的录入历史供你选择, 大大提高录入速度及准确性.
    2014-06-06
  • asp.net中利用ajax获取动态创建表中文本框的值

    asp.net中利用ajax获取动态创建表中文本框的值

    通常在做主从表的数据录入中,会碰到在一个页面上同时录入主表数据和从表数据,主表的数据只有一条,从表的数据有一条到多条,这样就要动态创建从表数据录入入口。
    2010-03-03
  • DataGrid中实现超链接的3种方法

    DataGrid中实现超链接的3种方法

    这篇文章介绍了DataGrid中实现超链接的3种方法,有需要的朋友可以参考一下
    2013-09-09
  • IE10下Gridview后台设置行高不起作用解决方法

    IE10下Gridview后台设置行高不起作用解决方法

    GridView1.HeaderStyle.Height=17发现在IE10 中不起作用,经过反复测试修改为e.Row.Cells[0].Height=17即可解决问题,有类似问题的朋友可以参考下哈
    2013-04-04
  • 防止.NET应用多实例运行的有效方法

    防止.NET应用多实例运行的有效方法

    在开发桌面应用程序时,可能会遇到这样一种需求:限制程序只能同时运行一个实例,如果用户试图再次启动同一个程序,应该将已经运行的程序窗口置于前台而不是启动一个新实例,这篇文章提供了一种通过检测当前程序实例并激活已运行实例的方法,需要的朋友可以参考下
    2024-12-12

最新评论