我有一堆控制器,它们也提供不同版本的API。
例如
/api/v1/controllerA/method
/api/v2/controllerA/method
/api/v1/controllerB/method
现在,我想使用提供的.NET属性将/v1/controllerA/method
标记为obsolete
。
但是,我还想记录每次使用过时控制器的情况。需要说明的是,这些控制器方法不会产生编译警告/错误,因为没有人在解决方案中直接引用它们。它们在运行时由http客户端调用。因此,警告对我无济于事。
我知道如何进行日志记录,只是不确定什么是拦截obsolete
控制器方法的调用的最佳方法。
答案 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;
});
}
}