2016-07-15 6 views
4

IUserStoreFindByNameAsyncメソッドをオーバーライドしたいです。方法は、UserManagerクラスのCreateAsyncメソッドで使用されます。私が得た私は、メソッドからIdentityUserインスタンスを返す場合、それが正常に動作しますが、私はnullを返した場合(例えば、そのユーザ名のユーザが存在しない):Asp .Net Identity - カスタムIUserStore FindByNameAsyncメソッド

{「メッセージ」:「エラーが発生しました。」、 "ExceptionMessage": "オブジェクト参照がオブジェクトのインスタンスに設定されていません。"、 "ExceptionType": "System.NullReferenceException"、 "StackTrace": "Microsoft.AspNet.Identity.UserValidator`2。ValidateUserName d__4.MoveNext()

これは私のオーバーライドメソッド

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

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

デフォルト実装では、Asp .Net Identity EntityFrameworkの実装が使用されました。 https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.EntityFramework/UserStore.csにあります。私の実装では、EFまたはLINQは使用しません。nullを返すだけです。 – Minja

答えて

4

コードでタスクを返す必要があります。下記の変更を参照してください。これは、呼び出し元がTaskを予期し、Task内の結果がnullの値を返したいものであるためです。 nullを直接返すことにより、呼び出し元が(awaitまたはTask.Resultを介して)タスクのラップを試みると失敗し、NullReferenceExceptionが生成されます。

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

ありがとう、私はダイレクトキャスティング以外のすべてのオプションを試しました。 – Minja

関連する問題