.NET Core使用 CancellationToken 取消API请求

这篇具有很好参考价值的文章主要介绍了.NET Core使用 CancellationToken 取消API请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-840734.html

长时间运行的任务请求

现在我们假设您有一个 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端可以看到,操作方法执行完成两次。

.NET Core使用 CancellationToken 取消API请求

这是否是正确将取决于您的应用程序。

如果请求修改某些业务的状态,那么您可能不希望在方法中途停止执行。如果请求没有副作用,那么您可能希望尽快停止(可能很昂贵)操作。

用户取消请求时,你可以使用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";
}

通过这个改变,我们可以再次测试我们的场景。

我们发出一个初始请求,然后我们重新加载页面。正如您从下面的日志中看到的,第一个请求不会继续执行。

.NET Core使用 CancellationToken 取消API请求

用户刷新浏览器取消请求后不久,原始请求就会中止,并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使用 CancellationToken 取消API请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序如何使用原生Websocket api与Asp.Net Core SignalR 通信

    如题,这可能算是.net 做小程序的服务端时,绕不开的一个问题,老生常谈了。同样的问题,我记得我2018/19年的一个项目的解决方案是: 修改官方的SignalR.js的客户端 :把里面用到浏览器的Websocket改成微信小程序的官方api的。目前网上也有不少这样的方案,已经改好开源了;

    2024年02月09日
    浏览(73)
  • 在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

    在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一种用于处理发生在 Web API 控制器或管道中的异常的机制。 异常筛选器可以捕获和处理应用程序中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如

    2024年01月19日
    浏览(42)
  • 使用asp.net core web api创建web后台,并连接和使用Sql Server数据库

    前言:因为要写一个安卓端app,实现从服务器中获取电影数据,所以需要搭建服务端代码,之前学过C#,所以想用C#实现服务器段代码用于测试,本文使用C#语言,使用asp.net core web api组件搭建服务器端,并访问sql server 数据库。 一、安装Visual studio 2022 社区版,并安装ASP.NET和

    2024年02月14日
    浏览(60)
  • ASP.Net Core Web API结合Entity Framework Core框架(API的创建使用,接口前端权限设置,前端获取API的Get,post方法)(程序包引用以及导入数据库)

    目录 1. Web Api 程序包引用 2. Web Api 的创建与Http类型的介绍 2.1 ASP.Net Core Web API项目的创建 2 .2  API接口的创建 2.3 HttpGet和HttpPost类型的区别 3.接口权限设置 4.HttpGet方法和HttpPOst方法 5.前端中用HttpGet/Poset获取接口数据 6.EF框架——配置数据库链接字符串(即将数据库中的表导入项

    2024年02月08日
    浏览(67)
  • .NET Core(C#)使用Titanium.Web.Proxy实现Http(s)代理服务器监控HTTP请求

    关于Titanium.Web.Proxy详细信息可以去这里仔细看看,这里只记录简单用法 NuGet直接获取Titanium.Web.Proxy 配置 与其说是配置,不如就说这一部分就是未来你需要使用的部分,想知道具体每个部分是干什么的就去看原文链接 全放过来太占地方 最后的 Console.Read(); 是一个等待函数,你

    2024年02月09日
    浏览(58)
  • .NET Core HttpClient请求异常分析

    推送逻辑是在类库中使用HttpClient,所以没有使用HttpClientFactory,因此定义静态变量来使用HttpClient,而非每一个请求就实例化一个HttpClient, 接下来我们来详细分析项目示例代码并对其进行改进 若对接方仅使用HTTPS协议,无需验证证书,最好是忽略证书验证,否则有可能会引起

    2024年02月03日
    浏览(49)
  • Asp.Net VS ASP.NET Core 请求管道

    参考链接 ASP.NET CORE 启动过程及源码解读 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象,封装此次请求有关的所有信息,然后进入HttpRuntime类进行进一步处理。HttpRuntime通过请求信息创建HttpContext上下文对象,此对象将贯穿整个管道,直到响应结束。同时创建或从应用

    2024年02月04日
    浏览(81)
  • .net Core API 添加 NLog

    nlog.config program.cs  NuGet packages:NLog、NLog.Web.AspNetCore 

    2024年02月12日
    浏览(36)
  • 实时监控.NET Core请求次数:创建记录最近5分钟的请求,轻松可靠

      概述: 在.NET Core中,通过创建RequestCountMiddleware中间件,结合MemoryCache,实现了记录最近5分钟请求次数的功能。该中间件在每个请求中更新计数,并使用缓存存储,为简单而实用的请求监控提供了一个示例。 要实现一个在.NET Core中记录最近5分钟请求次数的 RequestCountMiddlew

    2024年03月09日
    浏览(49)
  • 如何在 ASP.NET Core 配置请求超时中间件

    本文参考官方文档,使用Asp.net core 8.0 的最小API 模板项目,配置超时中间件。 超时中间件可用于所有类型的ASP.NET Core应用:最小 API、带控制器的 Web API、MVC 和 Razor Pages。请求超时的属性位于命名空间 Microsoft.AspNetCore.Http.Timeouts 中。 需要注意的是,当应用在调试模式下运行时

    2024年01月20日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包