我想覆盖IUserStore
FindByNameAsync
方法。方法用于CreateAsync
类的UserManager
方法。如果我从方法返回IdentityUser
实例,它可以正常工作,但如果我返回null
(例如没有用户使用该用户名),我得到了:
{"消息":"发生错误。"," ExceptionMessage":"对象引用未设置为对象的实例"" ExceptionType":" System.NullReferenceException""堆栈跟踪":"在Microsoft.AspNet.Identity.UserValidator`2。 ValidateUserName d__4.MoveNext()
这是我的覆盖方法
public Task<MyUser> FindByNameAsync(string userName)
{
return null;
}
我认为它在下面的代码段中UserValidator
类 - 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
方法返回什么以避免此异常?
答案 0 :(得分:5)
您还必须在代码中返回任务,请参阅下面的更改。这是因为调用者期望一个Task,并且Task中的结果是您想要返回的值null
。通过直接返回null
,调用者尝试解包任务(通过await
或Task.Result
)会失败,从而生成NullReferenceException
。
public Task<MyUser> FindByNameAsync(string userName)
{
return Task.FromResult((MyUser)null);
}