Я не могу передать объект из фильтра в контроллер, если мой метод фильтра asyn c. Почему? - PullRequest
0 голосов
/ 27 января 2020

У меня есть следующая модель:

Заказчик:

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 что-то забыл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...