.NET Core MVC中如何获取当前执行控制器类型?DI注入问题求解
解决无法获取IActionContextAccessor及匿名上下文判断问题
1. 先注册IActionContextAccessor服务
ASP.NET Core里IActionContextAccessor默认不会自动注入,必须手动在DI容器中注册。在Program.cs的服务配置段添加:
// .NET 6+ 写法 builder.Services.AddActionContextAccessor();
如果是旧版本(比如.NET Core 2.x),可以手动注册实现类:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
2. 修正控制器类型判断逻辑
你原代码里的类型获取逻辑有问题:ControllerTypeInfo本身就是控制器类型的元信息,调用GetType()会拿到RuntimeType而非目标控制器类型。改成下面的写法更准确:
public bool InAnonymousContext() { var anonymousContext = false; if (_actionContextAccessor?.ActionContext != null) { var controllerType = _actionContextAccessor.ActionContext.ActionDescriptor.ControllerTypeInfo?.AsType(); // 用IsAssignableFrom比IsSubclassOf更稳妥,覆盖控制器直接继承或本身就是抽象类的情况 anonymousContext = controllerType != null && typeof(AbstractAnonymousApiController).IsAssignableFrom(controllerType); } return anonymousContext; }
3. 更轻量的替代方案:用特性标记+HttpContext判断
如果不想依赖IActionContextAccessor,可以给匿名控制器加个自定义特性,通过HttpContext获取端点元数据来判断:
// 定义标记特性 [AttributeUsage(AttributeTargets.Class)] public class AnonymousContextAttribute : Attribute { } // 给你的抽象控制器打上特性 [AnonymousContext] public abstract class AbstractAnonymousApiController : ControllerBase { } // 判断逻辑改成这样 public bool InAnonymousContext(IHttpContextAccessor httpContextAccessor) { var endpoint = httpContextAccessor.HttpContext?.GetEndpoint(); return endpoint?.Metadata.GetMetadata<AnonymousContextAttribute>() != null; }
这种方式只需要注册IHttpContextAccessor(builder.Services.AddHttpContextAccessor();),不需要额外依赖IActionContextAccessor,逻辑更简洁。
内容的提问来源于stack exchange,提问作者jenson-button-event
相关产品推荐
相关产品推荐

