public class VBAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
public async void OnAuthorization(AuthorizationFilterContext context)
{
// …
await something;
// …
}
}
Метод async void
- это почти всегда плохая идея .Асинхронные методы должны возвращать Task
, чтобы вызывающие могли определить результат асинхронного процесса.
Поскольку вы реализуете IAuthorizationFilter
, вы реализуете синхронный фильтр авторизации.Вы используете это, когда вам не нужно делать что-то асинхронно.Это, например, верно, если вам просто нужно посмотреть на некоторые параметры, а затем получить какое-то решение, чтобы определить, разрешен ли доступ.
Если вам требуются асинхронные процессы, вы должны не сделать метод void
асинхронным, но вместо этого реализовать IAsyncAuthorizationFilter
.Это интерфейс для реализации асинхронного фильтра авторизации.В этом случае метод, который вам нужно реализовать, выглядит немного иначе:
Task OnAuthorizationAsync(AuthorizationFilterContext context)
Как видите, этот метод возвращает Task
, поэтому он может правильно выполнять асинхронные процессы.В вашем случае, когда вы хотите await
что-то внутри метода, вы можете просто сделать это:
public class VBAuthorizeAttribute : AuthorizeAttribute, IAsyncAuthorizationFilter
{
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
// …
await something;
// …
}
}
Теперь, с надлежащим асинхронным методом, который возвращает Task
, вызывающая система будетбыть в состоянии правильно использовать метод, и продолжение обработки запроса будет ожидать обработки вашего фильтра авторизации.