自定义属性对象生存期和隔离

时间:2013-09-26 16:25:38

标签: c# asp.net-web-api thread-safety custom-attributes

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

任何人都知道可以确认或否认我的假设的任何资源或链接吗?

1 个答案:

答案 0 :(得分:4)

这取决于你将要使用的是什么。

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

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

但是,为HttpActionContextHttpControllerContext的每个请求创建了HttpActionDescriptor,然后将其传递给管道中的每个缓存过滤器。 see here

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