AuthorizeAttribute对象的生命周期是什么?它是基于Web请求还是短暂的?

8

我想了解AuthorizeAttribute的生命周期,开始调试AuthorizeAttribute的默认构造函数,但是没有任何提示。

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

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

请帮我理解这个AuthorizeAttribute的生命周期?
谢谢。

属性是关于元数据的,也许根本没有实例化。 - H H
但是要访问OnAuthorization方法需要拥有该类的一个对象。 - Deepak
1个回答

9
这个问题很棘手,因为AuthorizeAttribute既是一个Attribute,也是一个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加载任何与该操作方法相关的属性并执行它们。在这种情况下,有一个被加载为IAuthorizationFilter的实例,该实例扫描同一类的另一个实例,该实例是一个Attribute

如果需要显式控制过滤器的生命周期,则可以构建自己的IFilterProvider以实现此目的。

但是,无法控制属性的生命周期。您应该假定它始终作为单例加载,并且没有创建或销毁它的方法。

AuthorizeAttribute的默认行为(作为过滤器)扫描AuthorizeAttribute(作为属性)的另一个实例,以便读取它包含的用户/组元数据。过滤器执行重要任务,而属性只是一个标记。如果这太令人困惑了,您可以按照被动属性将它们分成2个单独的类。

感谢@NightOwl888的回答。 - Deepak
除了处理生命周期,还有没有办法在属性中使用 DI? - Deepak
@Deepak - 请参考此答案,了解如何使用自定义的IAuthorizationFilter和DI。正如我之前提到的,如果您需要注入生命周期短于单例的依赖项(因为全局过滤器是静态注册的,它们始终是单例),则可以构建自己的IFilterProvider - NightOwl888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接