【发布时间】:2015-09-21 20:18:01
【问题描述】:
好吧,请耐心等待,这可能需要一些解释,因此我有一个简单的帐户控制器;
[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 中查找用户的调用实际上永远不会获得返回值,如果我通过邮递员尝试请求它永远不会完成。
有人可以帮忙吗?
【问题讨论】:
-
你用
isValid做什么?你在任何地方都写过await吗? -
你能判断代码是否卡在
isValid.Result这一行吗?如果是这样,您可能遇到了死锁。阅读here,了解为什么您通常不想使用Task.Result来等待任务。 -
有时 var 是一件坏事,它会让你忘记等待...
-
@sstan 谢谢我只是假设是上面的行,因为调试器从来没有那么远,链接以及下面的答案都有帮助
标签: c# .net asp.net-web-api async-await task-parallel-library