Реализация OnActionExecuted на пользовательском ActionFilter - PullRequest
0 голосов
/ 12 сентября 2018

В настоящее время я пытаюсь реализовать ведение журнала запросов для моего проекта WebAPI.Мы изменяем это, чтобы быть асинхронным вверх и вниз.Рассмотрим следующий пример из нашего старого фильтра действий:

public class LogRequestActionFilter : ActionFilterAttribute
{
    private ILogRepository _logRepository;
    private RequestLogEntity _requestLogEntity;

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        _logRepository = (ILogRepository)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(ILogRepository));

        _requestLogEntity = new RequestLogEntity
        {
            LogDate = DateTime.UtcNow,
            Success = false
        };

        _logRepository.Add(_requestLogEntity);
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        Exception exception = actionExecutedContext.Exception;

        if (exception == null)
        {
            _requestLogEntity.Success = true;
        }
        else
        {
            _requestLogEntity.ErrorMessage = exception.Message;
        }

        _logRepository.Update(_requestLogEntity);
    }
}

Я пытаюсь избежать использования локатора служб в своих фильтрах, используя пассивные атрибуты и диспетчеры фильтров.Я следовал этому примеру Стивена (автора SimpleInjector).Это отлично подходит для некоторых других моих фильтров и работает как шарм. Мне удалось использовать эту статью, например, для создания атрибута / фильтра пассивной авторизации.

Но теперь очевидно, что при использовании этого Iпотерять возможность перехватить запрос, когда он закончен, т.е.OnActionExecuted.

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