首页 > 解决方案 > 在 .net core WebAPI 项目中,哪些事件会导致 http 请求被取消?

问题描述

假设我有一个普通的网站,没有前端框架,只有普通的旧表单、按钮和导航链接,我使用纯 JavaScript 调用 webAPI 来保存表单、获取数据等。

我的 WebAPI 使用取消令牌。

什么会导致请求被取消,因此将取消的令牌发送到我的 webAPI 项目。

我知道我可以手动中止请求或者如果有超时,但还有什么其他事情会导致取消发生?

我主要担心的是,如果用户填写了一个大表格,并且无论出于何种原因,保存表格的 api 请求需要很长时间,是否会离开页面,关闭浏览器/选项卡调用取消,而我的数据库更新不会完全的?

标签: c#asp.net-core-webapicancellationtokensource

解决方案


不等待asyn方法,调用async void方法,在释放原始线程的同时尝试在不同的线程上执行工作。所有这些问题都在释放调用者,然后 DI 处理为满足您的请求而创建的所有类型。例如你有一个班级

public class SomeProcessor
{
    public async Task ProcessAsync(string payload)
    {
        // some code
        await Task.Delay(1000); // some async action
        // some more code
    }

    public async void ProcessAsyncVoid(string payload)
    {
        // some code
        await Task.Delay(1000); // some async action
        // some more code
    }
}

然后你将它注入你的控制器并像这样使用它:

_processor.ProcessAsync(payload);

或这个:

_processor.ProcessAsyncVoid(payload);

不是 await它。您的控制器方法将返回,DI 将处理SomeProcessor类杀死您的逻辑。在日志中,您将看到它为OperationCanceledException.


推荐阅读