咨询AuthorizeAttribute生命周期及自定义过滤器构造函数调试问题
先直接给结论:默认情况下,AuthorizeAttribute(包括你继承它的CustomAuthorizeAttribute)是单例(Singleton)生命周期——它会在应用启动阶段(比如程序集加载、控制器/Action路由注册时)被实例化一次,之后所有请求都会复用同一个实例,既不是每次请求创建(per-request),也不是瞬态(transient)。
为什么你的构造函数调试断点没命中?
特性(Attribute)的实例化时机和常规类不同:当你把[CustomAuthorize]标记在控制器或Action方法上时,这个属性实例是在应用启动初期(而非请求到来时)被创建的。如果你是在发送请求后才调试,自然不会命中构造函数的断点。
要调试构造函数,你需要在应用启动的早期阶段设置断点,比如:
- 当Web API的路由配置完成时
- 当控制器类型被反射加载时(应用启动时会自动扫描并加载控制器类型)
注意事项:单例生命周期的影响
因为是单例,你在构造函数中初始化的变量会被所有请求共享。比如你代码里的string test,如果后续修改它的值,会影响所有后续请求,要特别注意线程安全问题。
如果需要Per-Request的授权过滤器怎么办?
如果你的业务逻辑需要每次请求都使用新的过滤器实例,不要继承AuthorizeAttribute,而是直接实现IAuthorizationFilter接口,然后通过依赖注入来管理它的生命周期(比如注册为瞬态),或者在全局过滤器中通过类型添加(Web API会为每个请求创建新的实例)。举个简单例子:
public class CustomAuthorizationFilter : IAuthorizationFilter { public CustomAuthorizationFilter() { // 每次请求都会执行这个构造函数 string test = string.Empty; } public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) { // 你的授权逻辑 return continuation(); } } // 在WebApiConfig中注册 config.Filters.Add(typeof(CustomAuthorizationFilter));
这样配置后,每次请求都会创建一个CustomAuthorizationFilter的新实例,构造函数也会在请求时被调用,就能正常命中调试断点了。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

