HandleRequirementAsyncメソッドをオーバーライドしていますので、そのメソッドの戻り値の型を変更できません。しかし、私は非同期であり、待たなければならないUserManagerのメソッドを呼び出していますので、このコードを別のメソッドに入れる必要がありました。どのように非同期メソッドを呼び出すと、C#で.Resultを使わずに非同期にすることはできません。
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
EducationArmRequirement requirement)
{
if (!IsEducationGroup(context).Result)
{
return Task.FromResult(0);
}
context.Succeed(requirement);
return Task.FromResult(0);
}
protected async Task<bool> IsEducationGroup(AuthorizationHandlerContext context)
{
var userId = context.User.Identity.Name;
ApplicationUser u = await _userManager.FindByNameAsync(userId);
if (u.Group == 3 || u.Group == 4)
{
return await Task.FromResult(true);
}
return await Task.FromResult(false);
}
上記のコードはテストでは動作するようですが、.Resultを使用してboolを取得するためにタスクをアンラップします。私は結果を使用するのに注意すると言ういくつかの場所を見てきました。私はこれを見たquestion理由を説明しようとするが、私はそれを取得していない。
HandleRequirementAsyncメソッドには、このオーバーライドされたメソッドではできない戻り値の型を変更する必要があるため、これを正常に解除できるようにすることはできません。
私はこれを.Resultを使う上で正しい方法に近づけていますか、私はここでいくつかの問題に出くわしていますか?もしそうなら、これにアプローチする別の方法は何でしょうか?
どのようなヘルプ/説明も高く評価されます。
だけタスクHandleRequirementAsync'非同期 '保護されたオーバーライドとしてメソッドを定義します。ここでは戻り値の型の変更はありません。また、 'await'を使用することもできます。 –
' return await Task.FromResult(true);の必要もありません。 'return true; 'と一緒に行けばいいです。 –
@AlekseyL。メモをありがとう。私はこれを最初に試みましたが、戻り値の型としてTaskについて苦情を申し立てました。このエラーを伴うタスクが欲しかった:'EducationArmHandler.HandleRequirementAsync(AuthorizationHandlerContext、EducationArmRequirement)'は 'Task'を返す非同期メソッドであるため、オブジェクト表現によって。 「仕事」を返すつもりでしたか? \tその後、タスクに変更すると、オーバーライドされたメソッドの型と一致しないため、その型のオーバーロードはありません。 –
Xaxum