gpt4 book ai didi

c# - 为什么属性中的异步/等待方法永远不会返回

转载 作者:太空狗 更新时间:2023-10-30 00:24:00 25 4
gpt4 key购买 nike

好吧,请耐心等待,这可能需要一些解释,因此我有一个简单的帐户 Controller ;

[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();
}
}

HmacAuthentication 属性在这里:

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 发出请求,它永远不会完成。

有人可以帮忙吗?

最佳答案

public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
...

var isValid = await this.IsValidRequest(req, appId, incomingBase64Signature, nonce, requestTimeStamp);

if (isValid)
{
...
}
...
}

正如编译器所建议的,您只能在标记为 async 的方法中使用 await 关键字。所以我相应地更新了 AuthenticateAsync 的签名。另请注意,您现在可以只检查 isValid 而不是执行 isValid.Result 因为 bool 值将在 await 行之后可用。

这可能有点令人困惑,因为 IAuthenticationFilter 的接口(interface)没有指定异步(接口(interface)不能,它们只能指示该方法将返回一个任务)。由实现者决定该方法是简单地返回任务还是提供异步以便可以在方法主体内等待值。

关于c# - 为什么属性中的异步/等待方法永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com