【问题标题】:Asp .Net Identity - Custom IUserStore FindByNameAsync methodAsp .Net Identity - 自定义 IUserStore FindByNameAsync 方法
【发布时间】:2016-11-18 22:46:32
【问题描述】:

我想覆盖 IUserStore FindByNameAsync 方法。方法用于UserManager 类的CreateAsync 方法。如果我从该方法返回 IdentityUser 实例,它工作正常,但如果我返回 null(例如,没有具有该用户名的用户)我得到:

{"Message":"发生错误。","ExceptionMessage":"对象引用未设置为对象的实例。","ExceptionType":"System.NullReferenceException","StackTrace":" at Microsoft.AspNet.Identity.UserValidator`2.ValidateUserName d__4.MoveNext()

这是我的覆盖方法

public Task<MyUser> FindByNameAsync(string userName)
{
    return null;
}

我认为它在 UserValidator 类中失败 - 下面代码 sn-p 中的 ValidateUserName 方法。

else
{
    var owner = await Manager.FindByNameAsync(user.UserName).WithCurrentCulture();
    if (owner != null && !EqualityComparer<TKey>.Default.Equals(owner.Id, user.Id))
    {
        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, user.UserName));
    }
}

FindByNameAsync 方法返回什么来避免这个异常?

【问题讨论】:

标签: c# asp.net asp.net-web-api asp.net-identity


【解决方案1】:

您仍然必须在代码中返回一个任务,请参阅下面的更改。这是因为调用者需要一个 Task 并且 Task 中的结果是您想要返回的具有 null 值的结果。通过直接返回null,调用者尝试解包任务(通过awaitTask.Result)失败,生成NullReferenceException

public Task<MyUser> FindByNameAsync(string userName)
{
    return Task.FromResult((MyUser)null);
}

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2018-10-18
    相关资源
    最近更新 更多