过时的控制器日志记录

时间:2018-09-17 13:56:18

标签: c# asp.net-web-api

我有一堆控制器,它们也提供不同版本的API。

例如

/api/v1/controllerA/method
/api/v2/controllerA/method
/api/v1/controllerB/method

现在,我想使用提供的.NET属性将/v1/controllerA/method标记为obsolete

但是,我还想记录每次使用过时控制器的情况。需要说明的是,这些控制器方法不会产生编译警告/错误,因为没有人在解决方案中直接引用它们。它们在运行时由http客户端调用。因此,警告对我无济于事。

我知道如何进行日志记录,只是不确定什么是拦截obsolete控制器方法的调用的最佳方法。

1 个答案:

答案 0 :(得分:1)

遵循Passive Attributes by Mark Seemann

的模式

他有关于如何执行此操作的完整示例

这是一个可以做到这一点的类的幼稚实现

public class ObsoleteLoggingFilter : IActionFilter
{
    private readonly ILogger _logger;
    public ObsoleteLoggingFilter(ILogger logger)
    {
        _logger = logger;
    }
    public bool AllowMultiple { get { return true; } }

    public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    {
        //check the action for obsolete, if null check the controller
        var obsoleteAttribute = actionContext
            .ActionDescriptor
            .GetCustomAttributes<ObsoleteAttribute>()
            .SingleOrDefault() ?? actionContext
                .ControllerContext
                .ControllerDescriptor
                .GetCustomAttributes<ObsoleteAttribute>()
                .SingleOrDefault();

        if (obsoleteAttribute == null)
            return continuation();

        var controller = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
        var user = actionContext.RequestContext.Principal.Identity.Name;

        return continuation().ContinueWith(t =>
        {
            _logger.WarnFormat("{0} is calling obsolete controller {1}", user, controller);
            return t.Result;
        });
    }
}