AuthorizeAttribute对象的生命周期是什么?是每个请求或瞬态网络?

时间:2018-01-08 11:49:56

标签: asp.net-mvc iis request authorize-attribute web-performance

我只是想知道AuthorizeAttribute的生命周期,并开始调试AuthorizeAttribute的默认构造函数,但无法获得任何命中。

这是自定义授权过滤器的代码。

 public class CustomAuthorizeAttribute :  AuthorizeAttribute
 {
    public CustomAuthorizeAttribute() : base()
    {
        string test = string.Empty;
    }
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        //Some code
    }
}

任何人都可以帮助我了解此AuthorizeAttribute的生命周期吗?

由于

1 个答案:

答案 0 :(得分:7)

这很难回答,因为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将它们分成两个单独的类。