В настоящее время я пытаюсь реализовать ведение журнала запросов для моего проекта 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.