Хорошо, так что медведь со мной может потребовать объяснения, у меня есть простой контроллер учетной записи;Почему метод async/await в атрибуте никогда не возвращается
[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'? Вы когда-нибудь ждали? – sstan
Можете ли вы определить, застрял ли код в строке 'isValid.Result'? Если это так, вы, вероятно, сталкиваетесь с тупиком. Прочитайте [здесь] (http://stackoverflow.com/questions/17248680/await-works-but-calling-task-result-hangs-deadlocks), почему вы обычно не хотите использовать 'Task.Result', чтобы ждать задача. – sstan
иногда вар - это плохо, это заставляет вас забыть ожидание ... –