好的,请跟着我一起来,这可能需要一些解释。我有一个简单的账户控制器,如下所示:
[RoutePrefix("api/account")]
[Authorize]
[HmacAuthentication]
public class AccountController : ApiController
{
public async Task<IHttpActionResult> Register(UserModel userModel)
{
if (!this.ModelState.IsValid)
{
return this.BadRequest(this.ModelState);
}
IdentityResult result = await this._userService.RegisterUser(userModel);
var errorResult = this.GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
return this.Ok();
}
}
属性在这里:
public class HmacAuthenticationAttribute : Attribute, IAuthenticationFilter
{
public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
...
var isValid = this.IsValidRequest(req, appId, incomingBase64Signature, nonce, requestTimeStamp);
if (isValid.Result)
{
...
}
...
}
private async Task<bool> IsValidRequest(
HttpRequestMessage req,
string appId,
string incomingBase64Signature,
string nonce,
string requestTimeStamp)
{
...
var user = await this.UserService.FindUser(userId); // this never gets a return value
...
}
}
在
UserService
中调用的方法如下:public async Task<ApplicationUserModel> FindUser(int id)
{
var user = await this._userBusiness.FindAsync(id);
return this.MapToModel(user);
}
在商务舱中是这样的:
public async Task<ApplicationUser> FindAsync(int id)
{
var result = await this._userManager.FindByIdAsync(id);
return result;
}
我遇到的问题是,当调用 Register 方法时,HmacAuthentication 属性会触发并执行 AuthenticateAsync 过滤器方法。在 IsValidRequest 中查找用户的调用实际上从未返回任何值,如果我尝试通过 Postman 发送请求,它将永远无法完成。
请问是否有人能帮忙解决这个问题?
isValid
做了什么?你在任何地方对它进行了await
吗? - sstanisValid.Result
这一行?如果是,那么你可能遇到了死锁问题。请阅读这里,了解为什么通常不建议使用Task.Result
等待任务完成。 - sstan