在自定义ActionFilter上实现OnActionExecute

时间:2018-09-12 10:06:48

标签: c# dependency-injection asp.net-web-api2 actionfilterattribute

我目前正在尝试为我的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);
    }
}

我试图通过使用被动属性和过滤器分派器来避免在过滤器中使用服务定位器。我一直在关注来自Steven(SimpleInjector的作者)的this示例。这对我的其他一些过滤器非常有用,它的作用就像是一种魅力,例如,我设法使用本文来制作被动授权属性/过滤器。

但是现在很明显,使用它我失去了在请求完成时捕获请求的能力,即。 OnActionExecuted。

0 个答案:

没有答案