Отмена в ASP.NET Core UserManager

В настоящее время я реализую некоторые услуги на основе дизайна UserManger Asp.Net Core Identity. В реализации мне было интересно, как менеджер пользователей может поддерживать отмену, если нет возможности передать токен отмены в методы 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 ? В случае положительного ответа: почему это отличается от других компонентов, где используются CancellationTokens, например EF Core, где вы должны передать CancellationToken через параметр метода?


person Retrogott    schedule 08.11.2019    source источник


Ответы (2)


UserManager обрабатывает отмену внутри себя и получает токен отмены от HttpContext.RequestAborted. Таким образом, вам не нужно передавать токен отмены, поэтому методы его не принимают.

person Chris Pratt    schedule 08.11.2019
comment
Но откуда у него доступ к HttpContext? Единственный способ сделать это — внедрить ISericeProvider, но он просто использует его для получения ILookupProtectorKeyRing / ILookupProtector или TokenProviders. Я не вижу строки, где он что-то делает с HttpContext или даже где-нибудь устанавливает CancelToken? - person Retrogott; 08.11.2019
comment
DbContext имеет внутреннего поставщика услуг. Дело в том, что вам не нужно беспокоиться об этом вообще. UserManager позаботится об отмене по умолчанию. Вы ничего не делаете. - person Chris Pratt; 08.11.2019
comment
Любые подсказки, как использовать UserManager в BackgroundService? Время от времени срабатывает токен отмены, который не имеет ничего общего с фоновой службой. В моем сервисе у меня есть цикл, который проверяет какое-то условие, и если они проходят, создается новый IServiceScope, из которого я извлекаю UserManager. Если это всегда связано с каким-то (не связанным) HttpContext, это настоящий беспорядок. Как мне использовать его независимо от каких-либо HttpContext? - person Lars; 06.01.2020
comment
Он использует HttpContext, только если он существует (веб-запрос). Он не создает его. Что касается отмены, то в любом случае это функция какого-то внешнего процесса. Как пользователь, закрывающий соединение на другом конце. Нет смысла поддерживать отмену в чем-то без присмотра, например, в фоновой службе, поскольку ничто никогда не будет действовать для отмены. - person Chris Pratt; 06.01.2020
comment
Думаю, мне нужно выяснить, что вызывает отмену. У меня есть приложение Asp.Net Core с размещенной службой, так что более или менее оба мира. Единственная отмена в фоновой службе, которая может произойти, — это остановка службы. Благодарю вас! - person Lars; 07.01.2020
comment
Это то, что я пытался сказать, купить, возможно, было неясно. Фактическая остановка службы не является отменой, которая резко закроет соединение SQL, и БД справится с этим естественным образом. Отмена на раз. когда все хорошо, все работает в штатном режиме, но по какой-то причине (обычно по инициативе пользователя) оп уже не нужен. Это просто не то, что может произойти в фоновой службе. - person Chris Pratt; 07.01.2020