【问题标题】:Cancellation in ASP.NET Core UserManagerASP.NET Core UserManager 中的取消
【发布时间】:2020-03-04 21:44:13
【问题描述】:

我目前正在实现一些基于 Asp.Net Core Identity 的 UserManger 设计的服务。 在实现中,我想知道如果无法将取消令牌传递给 UserManager 的方法,用户管理器如何支持取消。

我还看到用户管理器内部有一个取消令牌属性(具有默认值),由它在内部使用,并将传递给使用的异步方法。但是由于其保护级别,此属性不可访问

protected virtual CancellationToken CancellationToken => CancellationToken.None;

如何将我在控制器中使用的取消令牌传递给用户管理器?我是否必须重载它并通过新方法将其传递给它?

public class MyUserManager : UserManager<MyUser>
{
    /* ... Other stuff... */

    protected override CancellationToken CancellationToken  {get;set;}

    public void SetCancellationToken(CancellationToken cancellationToken)
    {
         this.CancellationToken = cancellationToken;
    }

}

这是使用 userManager 完成 Cancellation 的正确方法吗?如果是:为什么这与使用取消令牌的其他组件不同,例如 EF Core,您必须通过方法参数传递 CancellationToken?

【问题讨论】:

    标签: asp.net-core cancellation asp.net-core-3.0 cancellation-token


    【解决方案1】:

    UserManager 在内部处理取消,并从HttpContext.RequestAborted 获取取消令牌。因此,您不需要传递取消令牌,这就是方法不接受取消令牌的原因。

    【讨论】:

    • 但是他在哪里可以访问 HttpContext 呢?他能够做到这一点的唯一方法是注入的 ISericeProvider,但他只是使用它来获取 ILookupProtectorKeyRing / ILookupProtector 或 TokenProviders。我看不到他对 HttpContext 执行任何操作的行,甚至在任何地方都看不到 cancelToken ?
    • DbContext 有一个内部服务提供者。关键是你根本不需要担心这个。 UserManager 负责处理开箱即用的取消。你什么都不做。
    • 任何提示如何在BackgroundService 中使用UserManager?有时会触发取消令牌,这与后台服务无关。在我的服务中,我有一个循环来检查某些条件,如果它们通过了一个新的IServiceScope,我会从中检索UserManager。如果它总是绑定到一些(不相关的)HttpContext,那真是一团糟。我应该如何独立于任何HttpContext 使用它?
    • 它只使用 HttpContext 如果它存在(网络请求)。它不会创建一个。就取消而言,无论如何,这是一些外部过程的功能。就像用户在另一端关闭连接一样。在后台服务等无人看管的情况下支持取消是没有意义的,因为没有任何事情会采取行动取消。
    • 我想我必须调查一下,是什么触发了取消。我在这里有一个带有托管服务的 Asp.Net Core 应用程序,因此或多或少是两个世界。后台服务中唯一可能发生的取消是服务的停止。谢谢!
    【解决方案2】:

    UserManager 中,设置CancellationToken = CancellationToken.None,并将其用于所有任务。

    https://github.com/dotnet/aspnetcore/blob/b9efadc59ddbf6743775244622fb95301dd1846c/src/Identity/Extensions.Core/src/UserManager.cs#L53

    the Microsoft docs中所述:

    此属性返回的取消令牌无法取消

    所以UserManager 的所有任务都会在调用Dispose() 方法之后除外,因为所有任务都会调用ThrowIfDisposed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 2022-01-12
      • 2016-07-31
      • 2020-10-29
      相关资源
      最近更新 更多