У меня есть следующая модель:
Заказчик:
public class Customer
{
public int CustomerId { get; set; }
... some props
}
И следующий метод репозитория:
public async Task<T> GetAsync(Expression<Func<T, bool>> where, string includeProperties = "")
{
IQueryable<T> query = _dbset;
foreach (var includeProperty in includeProperties.Split
(new char[] {','}, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
return await query.FirstOrDefaultAsync(where);
}
У меня есть следующий фильтр:
public class IncludeCustomerToHttpContext : ActionFilterAttribute
{
public override async void OnActionExecuting(ActionExecutingContext context)
{
var customerRepository = context.HttpContext.RequestServices.GetService<ICustomerRepository>();
var authHeader = context.HttpContext.Request?.Headers["Authorization"].ToString();
if (!Int32.TryParse(authHeader, out int clientId))
{
context.Result = new UnauthorizedResult();
}
var customer = await customerRepository.GetAsync(x => x.CustomerId == clientId, typeof(Application).Name);
if (customer == null)
{
context.Result = new UnauthorizedResult();
}
context.ActionArguments["Customer"] = customer;
}
}
И следующее действие в контроллере:
public async Task<IActionResult> Update([FromBody] CustomerChangeViewModel viewModel, Customer customer)
{
...
}
Если OnActionExecuting
асин c У меня пустой (по умолчанию) customer
объект. Чтобы исправить это, я должен удалить async
из OnActionExecuting
и сделать метод как syn c. Но это не хорошо. Потому что это значит, что я вынужден сделать GetAsync
синхронным. Почему это происходит? Что не так? Как это исправить?
Обновление
Спасибо за комментарии! Теперь у меня есть следующий фильтр
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var customerRepository = context.HttpContext.RequestServices.GetService<ICustomerRepository>();
var authHeader = context.HttpContext.Request?.Headers["Authorization"].ToString();
if (!Int32.TryParse(authHeader, out int clientId))
{
context.Result = new UnauthorizedResult();
}
var customer = await customerRepository.GetAsync(x => x.CustomerId == clientId, typeof(Application).Name);
if (customer == null)
{
context.Result = new UnauthorizedResult();
}
context.ActionArguments["Customer"] = customer;
await next();
}
Но после запуска у меня есть следующее исключение:
«IncludeCustomerToHttpContext» не является атрибутом
I что-то забыл?