我只是想知道AuthorizeAttribute的生命周期,并开始调试AuthorizeAttribute的默认构造函数,但没有成功。
这是自定义授权过滤器的代码。
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public CustomAuthorizeAttribute() : base()
{
string test = string.Empty;
}
public override void OnAuthorization(HttpActionContext actionContext)
{
//Some code
}
}
任何人都可以帮助我了解此AuthorizeAttribute的生命周期吗?
谢谢
最佳答案
这很难回答,因为AuthorizeAttribute
既是Attribute
又是IAuthorizationFilter
。
在Attribute
的上下文中,这是MVC框架第一次使用loaded when GetAttributes() is called。属性是元数据,因此如果在连接调试器之前加载了它就不足为奇了。
在IAuthorizationFilter
的上下文中,它取决于过滤器的注册方式。如果注册为全局过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomAuthorizeAttribute());
filters.Add(new HandleErrorAttribute());
}
}
然后,显然在MVC应用程序启动期间将其实例化,并且在这种情况下,filters集合是静态的,因此每次启动仅实例化一次。
如果将过滤器作为属性放置在控制器或操作方法上,那将使事情变得更加混乱。运行某个动作时,MVC框架会使用
FilterAttributeFilterProvider
加载与该动作方法有关的所有属性,并执行它们。在这种情况下,有一个实例作为IAuthorizationFilter
加载,该实例扫描同一个类的另一个实例,即Attribute
。如果需要显式控制过滤器的生存期,则可以build your own
IFilterProvider
做到这一点。但是无法控制属性的生存期。您应该假设它始终以单例形式加载,并且无法创建或销毁它。
AuthorizeAttribute
(作为过滤器)的默认行为会扫描AuthorizeAttribute
(作为属性)的另一个实例,以读取其包含的用户/组元数据。过滤器很繁重,属性只是一个标记。如果这太令人困惑,则可以根据Passive Attributes将它们分为2个单独的类。