Исключение StackOverflow при переопределении метода возврата Task при добавлении асинхронного - PullRequest
0 голосов
/ 13 мая 2018

У меня есть пользовательский класс диспетчера пользователей (ASP .NET Identity). Я хочу переопределить FindByIdMethod, чтобы он автоматически загружал имена ролей для пользовательской модели. Это единственный метод, который я переопределяю. Я использую Microsoft.Identity пакеты nuget версии 2.2.1, Asp.Net Framework.

Однако приведенный ниже код вызывает исключение StackOverflow - на await base.FindByIdAsync(userId);

 public class MyUserManager : UserManager<MyUser>, IMyUserManager
 {
    public override async Task<MyUser> FindByIdAsync(string userId)
    {
        var user = await base.FindByIdAsync(userId);
        user.RoleNames = await this.GetRolesAsync(user.Id);
        return user;
    }
 }

Когда я пытаюсь подобный код без добавления «асинхронного» в переопределенную подпись, он работает нормально - однако я не могу загрузить имена своих ролей в этом методе:

public override Task<MyUser> FindByIdAsync(string userId)
{
    var userTask = base.FindByIdAsync(userId); //no errors in this approach
    return userTask; //but also no custom behaviour 
}

Я подозреваю, что IMyUserManager может быть проблематичным, но он мне нужен для IOC / DI. Это был автоматически сгенерированный интерфейс, поэтому он имеет все открытые члены класса UserManager.

Класс пользователя:

public class MyUser: IdentityUser
{
    public string DisplayName { get; set; }
    public bool IsActivated { get; set; }
    public bool MustChangePassword { get; set; }
    public IList<string> RoleNames { get; set; } = new List<string>();
}

Сведения об исключении: enter image description here

Стек вызовов (TelimenaUserManager = MyUserManager, я упростил имя)

enter image description here

ОБНОВЛЕНИЕ:

Благодаря предложениям Хенка в комментариях я вижу, что рекурсия происходит в методе GetRolesAsync ... enter image description here

1 Ответ

0 голосов
/ 13 мая 2018

Для полноты я отправляю рабочий код.

Мне пришлось преобразовать текущий IUserStore в IUserRoleStore (необходимы оба универсальных аргумента!).

Тогдаполучить роли на основе пользовательского экземпляра (что позволяет избежать рекурсии «Поиск пользователя»)

 public override async Task<MyUser> FindByIdAsync(string userId)
        {
            var user = await base.FindByIdAsync(userId);
            var roleStore = this.Store as IUserRoleStore<MyUser, string>;
            user.RoleNames = await roleStore.GetRolesAsync(user);
            return user;
        }

Спасибо @HenkHolterman!

...