Kei*_*ith 2 c# dependency-injection request-cancelling .net-core asp.net-core
我有一个 .NET 核心依赖项,其范围仅限于每个 REST API 请求。它是Startup.ConfigureServices通过调用添加的AddScoped。
我想为此添加取消支持。如果我将 a 添加CancellationToken cancellationToken到任何控制器操作的参数中,我可以获得一个在客户端请求被取消时被取消的令牌。然后我可以将该令牌传递给我的依赖项上的所有方法。
但是,依赖关系的范围仅限于请求,因此通过操作将令牌传递给方法感觉没有必要 - 我可以以CancellationToken某种方式将其添加到范围依赖关系中吗?
我可以以某种方式将 CancellationToken 添加到作用域依赖项中吗?
嗯,从技术上来说是的。即通过注入IHttpAccessor和访问HttpContext.RequestAborted属性,这与您通常传递到控制器操作(如果已定义)中的取消标记相同。
但使用操作参数重载实际上有点不鼓励,因为在每个控制器操作中,您都可以通过访问取消令牌HttpContext.RequestAborted并将其放在控制器操作中,这会使令牌公开,即在创建 Swagger 方案时(至少是 2017 年的情况),因为使用HttpContext本身并没有将其暴露给公众。
唯一的例外似乎是,当使用“Poco 控制器”时,它不继承Controller或ControllerBase不注入IHttpAccessor到该控制器中。
但是,将取消令牌注入任意服务是有问题的,因为您对 Web 框架 ( IHttpAccessor/ HttpContext) 存在严格依赖。
最好和最干净的方法是在方法上保留一个CancellationToken参数,该参数可以以有意义的方式取消,并使令牌可选,因此您只能在有请求或可以取消的情况下传递参数
public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2154 次 |
| 最近记录: |