自定义属性对象的生命周期和隔离

mck*_*ejm 4 c# custom-attributes thread-safety asp.net-web-api

我有一个 Web API 项目,我打算使用继承自的属性ActionFilterAttribute以标准化方式进行日志记录。作为该日志记录的一部分,我想从HttpActionContextOnActionExecuting方法中提取一些值。然后我想将它们称为OnActionExecuted. 我已经指定了[AttributeUsage(AttributeTargets.Class)]这个属性。我的假设是,我的自定义属性将与它所应用的类一起实例化,并且与应用该属性的类具有相同的生命周期。我找不到任何具体支持这一点的东西。我已经做了一些测试,这似乎是它的工作原理,但我担心我的测试太有限。我假设对同一控制器的多次调用将生成该控制器的新实例,从而生成该属性的新实例。我基本上担心作为OnActionExcecuting.

有人知道可以证实或否定我的假设的任何资源或链接吗?

Fil*_*p W 5

这取决于您要使用什么。

Web API 中的属性(过滤器)被缓存(过滤器管道private readonly Lazy<Collection<FilterInfo>> _filterPipeline;仅初始化一次)。看这里

因此,如果您在属性的构造函数中初始化某些内容,它将在后续执行中保持不变。

但是,它HttpActionContext是为每个请求创建的HttpControllerContextHttpActionDescriptor然后传递到管道中的每个缓存过滤器。看这里

因此,即使重用过滤器的实例,方法中上下文的值也是特定于特定请求的。