C# 带有CancellationTok的AddScope依赖项

C# 带有CancellationTok的AddScope依赖项,c#,asp.net-core,.net-core,dependency-injection,request-cancelling,C#,Asp.net Core,.net Core,Dependency Injection,Request Cancelling,我有一个.NET核心依赖项,其作用域为每个REST API请求。它通过调用AddScoped添加到Startup.ConfigureServices中 我想为这个添加取消支持。如果我将CancellationToken CancellationToken添加到任何控制器操作的参数中,我可以获得一个在客户端请求被取消时被取消的令牌。然后,我可以将该令牌传递给依赖项上的所有方法 但是,依赖关系的作用域是请求,因此通过操作将令牌向下传递给方法感觉没有必要-我是否可以将CancellationToken

我有一个.NET核心依赖项,其作用域为每个REST API请求。它通过调用
AddScoped
添加到
Startup.ConfigureServices

我想为这个添加取消支持。如果我将
CancellationToken CancellationToken
添加到任何控制器操作的参数中,我可以获得一个在客户端请求被取消时被取消的令牌。然后,我可以将该令牌传递给依赖项上的所有方法

但是,依赖关系的作用域是请求,因此通过操作将令牌向下传递给方法感觉没有必要-我是否可以将
CancellationToken
以某种方式添加到作用域依赖关系中

我是否可以将CancellationToken以某种方式添加到作用域依赖项中

从技术上说是的。i、 e.通过注入
IHttpAccessor
并访问
HttpContext.RequestAborted
属性,该属性与通常传递到控制器操作(如果定义)的取消令牌相同

但实际上不鼓励使用动作参数重载,因为在每个控制器动作中,您都可以通过
HttpContext.RequestAborted
访问取消令牌,并且在控制器动作中使用它会使令牌公开,即在创建招摇过市方案时(至少在2017年是这样),其中,使用
HttpContext
本身并没有向公众公开它

唯一的例外似乎是,当使用“Poco控制器”时,它不是从
Controller
ControllerBase
继承的,并且没有将
IHttpAccessor
注入该控制器

但是将取消令牌注入任意服务是有问题的,因为您对web框架有一个硬依赖(
IHttpAccessor
/
HttpContext

最好且最干净的做法是在方法上保留一个
CancellationToken
参数,该参数可以以有意义的方式取消,并使令牌成为可选的,因此您只能在有请求或可以取消的情况下传递参数

public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}
public Task ProcessSomething(字符串参数1,CancellationToken CancellationToken=default)
{
}
我是否可以将CancellationToken以某种方式添加到作用域依赖项中

从技术上说是的。i、 e.通过注入
IHttpAccessor
并访问
HttpContext.RequestAborted
属性,该属性与通常传递到控制器操作(如果定义)的取消令牌相同

但实际上不鼓励使用动作参数重载,因为在每个控制器动作中,您都可以通过
HttpContext.RequestAborted
访问取消令牌,并且在控制器动作中使用它会使令牌公开,即在创建招摇过市方案时(至少在2017年是这样),其中,使用
HttpContext
本身并没有向公众公开它

唯一的例外似乎是,当使用“Poco控制器”时,它不是从
Controller
ControllerBase
继承的,并且没有将
IHttpAccessor
注入该控制器

但是将取消令牌注入任意服务是有问题的,因为您对web框架有一个硬依赖(
IHttpAccessor
/
HttpContext

最好且最干净的做法是在方法上保留一个
CancellationToken
参数,该参数可以以有意义的方式取消,并使令牌成为可选的,因此您只能在有请求或可以取消的情况下传递参数

public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}
public Task ProcessSomething(字符串参数1,CancellationToken CancellationToken=default)
{
}

可能重复@Métoule,尽管这个问题似乎是针对一般情况(即瞬态和静态范围),我认为这可能意味着无法完成。我特别要求使用更窄的
AddScoped
案例-我的注入依赖项适用于与取消令牌完全相同的范围。这不是不必要的。取消令牌用于提前取消正在进行的操作(即长时间运行的循环),并且与作用域无关,因此尽快停止请求并释放请求可能仍然有用。请求可能由于多种原因被取消,例如连接丢失、用户在浏览器中连续两次意外单击链接或在页面打开时按ESC键loading@Tseng是的,并且可能存在需要为其特定范围传递取消令牌的用例。但是,在这里,连接丢失、用户重复或中止请求都在同一范围内-这些都是与.NET不同的令牌,它们都是HTTP取消,在操作中看起来是相同的。作用域是相同的。可能是@Métoule的重复,尽管这个问题似乎是关于一般情况(即瞬态和静态作用域)的问题,我认为这可能意味着无法完成。我特别要求使用更窄的
AddScoped
案例-我的注入依赖项适用于与取消令牌完全相同的范围。这不是不必要的。取消令牌用于提前取消正在进行的操作(即长时间运行的循环),并且与作用域无关,因此尽快停止请求并释放请求可能仍然有用。请求可能由于多种原因被取消,例如连接丢失、用户在浏览器中连续两次意外单击链接或在页面打开时按ESC键loading@Tseng是的,并且可能存在需要为其特定范围传递取消令牌的用例。然而,这里的连接丢失、用户重复或中止请求都在同一个范围内-这些都不是.NET的不同标记,它们都是HTTP取消,将