【问题标题】:In a .net core WebAPI project, which events cause the http request to be cancelled?在 .net core WebAPI 项目中,哪些事件会导致 http 请求被取消?
【发布时间】:2019-08-01 01:01:56
【问题描述】:

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

我的 WebAPI 使用取消令牌。

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

我知道我可以手动中止请求或者如果有超时,但还有哪些其他因素会导致取消发生?

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

【问题讨论】:

  • 如果用户在忙的时候刷新页面,CancellationToken 将被设置,如果你的 db 操作仍在进行,它将被请求取消并假设 Sql Server,除非它是在事务中,它不会回滚。不确定是否关闭标签,但很可能也会设置令牌。
  • 不,一旦数据库正在进行中,如果端点处理取消令牌并且前端手动发送取消令牌,它将取消。离开不会导致前端向任何打开的长时间运行的 api 请求发送取消令牌。我会假设刷新也不会取消请求,而是排队另一个请求,除非这是从 js 手动处理的。
  • 如果使用 sql server,另一个问题可能是您的命令超时。我认为默认情况下它是 30 秒,所以如果您的查询需要更长的时间来保存,那么您可能会遇到超时问题,但保存表单需要很长时间。

标签: c# asp.net-core-webapi cancellationtokensource


【解决方案1】:

不等待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

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多