这很难回答,因为AuthorizeAttribute
是 anAttribute
和 an IAuthorizationFilter
。
在 的上下文中Attribute
,它在 MVC 框架第一次调用 GetAttributes() 时加载。属性是元数据,因此如果在附加调试器之前加载它就不足为奇了。
在 的上下文中IAuthorizationFilter
,它取决于过滤器的注册方式。如果注册为全局过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomAuthorizeAttribute());
filters.Add(new HandleErrorAttribute());
}
}
然后它显然在 MVC 应用程序启动期间被实例化,在这种情况下,过滤器集合是静态的,因此每次启动仅实例化一次。
如果过滤器作为属性放置在控制器或操作方法上,那么事情就会变得更加混乱。运行动作时,MVC 框架使用 加载与该动作方法相关的任何属性FilterAttributeFilterProvider
并执行它们。在这种情况下,有一个实例被加载为 a IAuthorizationFilter
,它扫描同一类的另一个实例,即Attribute
.
如果您需要显式控制过滤器的生命周期,那么您可以构建自己IFilterProvider
的过滤器来做到这一点。
但是没有办法控制属性的生命周期。您应该假设它始终作为单例加载,并且无法创建或销毁它。
AuthorizeAttribute
(作为过滤器)的默认行为扫描(作为属性)的另一个实例,AuthorizeAttribute
以便读取它包含的用户/组元数据。过滤器完成了繁重的工作,属性只是一个标记。如果这太令人困惑,您可以根据Passive Attributes将它们分成 2 个单独的类。