c# - 带有 CancellationToke 的 AddScoped 依赖项
问题描述
我有一个针对每个 REST API 请求的 .NET 核心依赖项。它是Startup.ConfigureServices
通过调用添加的AddScoped
。
我想为此添加取消支持。如果我将 a 添加CancellationToken cancellationToken
到任何控制器操作的参数中,我可以获得一个令牌,如果客户端请求是,则该令牌会被取消。然后我可以将该令牌传递给我的依赖项上的所有方法。
但是,依赖项的范围仅限于请求,因此通过操作将令牌向下传递给方法感觉没有必要 - 我可以CancellationToken
以某种方式将其添加到范围依赖项中吗?
解决方案
我可以以某种方式将 CancellationToken 添加到作用域依赖项中吗?
嗯,技术上是的。即通过注入IHttpAccessor
和访问HttpContext.RequestAborted
属性,如果已定义,这与您通常传递给控制器操作的取消标记相同。
但是实际上不鼓励使用动作参数重载,因为在每个控制器动作中,您都可以通过HttpContext.RequestAborted
它访问取消令牌,并且在控制器动作中使用它会使令牌公开,即在创建 Swagger 方案时(至少是 2017 年的情况),使用它HttpContext
本身并没有将其暴露给公众。
唯一的例外似乎是,当使用不继承Controller
或ControllerBase
不注入IHttpAccessor
该控制器的“Poco 控制器”时。
IHttpAccessor
但是将取消令牌注入任意服务是有问题的,因为您对 Web 框架 ( / HttpContext
)有硬依赖。
最好和最干净CancellationToken
的方法是在您的方法上保留一个可以以有意义的方式取消并使令牌可选的参数,因此您只能在您有请求或可以取消的情况下传递参数
public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}
推荐阅读
- python-3.x - 如何使用python3迭代数组字典混合结构?
- asp.net-mvc - 错误:用户 'WORKGROUP\PC-Name$' 登录失败
- java - Java 8 lambda从对象列表创建字符串列表
- powershell - powershell get-distributiongroupmember
- caching - 我应该使用 Redis 来缓存查询的响应吗?
- javascript - 从动态 asp 中获取价值:DropDownList
- javascript - Promises - 如何处理已知错误
- html - 视频背景全屏响应
- c++ - 升级到 Windows 10 后调试导致访问冲突的第 3 方 DLL
- php - 模态加载非常好,但它不会在模态内部响应