在.NET Core Web API中,有没有一种方法可以取消调用?

3
我们有一个.NET Framework前端,它调用一个.NET Core Web API来检索项目以展示给用户。如果用户调用了数万个项目并决定取消请求,它会继续消耗资源来获取项目,而我们知道用户不再需要检索。在.NET中,一旦呼叫到达服务,是否有一种取消呼叫的方法?

1
请查看cancellation tokens - Kenneth K.
1
你正在寻找CancellationToken吗? - Igor
我知道取消令牌,但并没有真正使用过它们。我知道我可以在.NET Framework和.NET Core应用程序中使用它们,但我没有意识到我可以将它们作为调用控制器端点的一部分传递。我会试试看。谢谢! - Ryan
1个回答

6

了解CancellationTokens

在一个示例控制器中

public class SlowRequestController : Controller
{
    private readonly ILogger _logger;

    public SlowRequestController(ILogger<SlowRequestController> logger)
    {
        _logger = logger;
    }

    [HttpGet("/slowtest")]
    public async Task<string> Get()
    {
        _logger.LogInformation("Starting to do slow work");

        // slow async action, e.g. call external api
        await Task.Delay(10_000);

        var message = "Finished slow delay of 10 seconds.";

        _logger.LogInformation(message);

        return message;
    }
}

您可以选择使用以下方法来完成此操作。
public class SlowRequestController : Controller
{
    private readonly ILogger _logger;

    public SlowRequestController(ILogger<SlowRequestController> logger)
    {
        _logger = logger;
    }

    [HttpGet("/slowtest")]
    public async Task<string> Get(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Starting to do slow work");

        for(var i=0; i<10; i++)
        {
            cancellationToken.ThrowIfCancellationRequested();
            // slow non-cancellable work
            Thread.Sleep(1000);
        }
        var message = "Finished slow delay of 10 seconds.";

        _logger.LogInformation(message);

        return message;
    }
}

您没有提到前端的外观,但您需要某种方式来从客户端请求中发出取消信号。一个例子可能是:

var xhr = $.get("/api/slowtest", function(data){
  //show the data
});

//If the user navigates away from this page
xhr.abort()

这里有很好的例子:

https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/

还有这里:

https://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspx


4
如果你要从网上的一篇文章中直接复制代码,那么你至少应该给作者以功劳...... https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/ - Heretic Monkey
1
是的,我正在处理它,我在使用手机,文字处理速度较慢。仅仅给出其他网站的链接是违规的,所以我想将代码示例上传。最好的情况是OP提供他的代码示例,这样就可以编写相关示例了。 - Dude0001
我知道取消令牌,但实际上并没有使用过它们。我知道可以在.NET Framework和.NET Core应用程序中使用它们,但我没有意识到可以将它们作为调用控制器端点的一部分传递。我会尝试一下。谢谢! - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接