You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中获取控制器类型及替代System.Web.HttpContext.Current的方法咨询

.NET Core 相关问题解决方案

一、获取控制器类型的实现方式

在.NET Core中,不建议依赖Assembly.GetExecutingAssembly()定位控制器所在程序集(控制器可能分散在不同程序集,且当前执行程序集未必是控制器所在集),推荐两种可靠方案:

方案1:通过IActionDescriptorCollectionProvider获取已注册的控制器

ASP.NET Core会将所有控制器的元信息注册到IActionDescriptorCollectionProvider,直接注入该服务即可获取所有控制器类型:

using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Controllers;

public class ControllerTypeHelper
{
    private readonly IActionDescriptorCollectionProvider _descriptorProvider;

    public ControllerTypeHelper(IActionDescriptorCollectionProvider descriptorProvider)
    {
        _descriptorProvider = descriptorProvider;
    }

    public IEnumerable<Type> GetAllControllerTypes()
    {
        return _descriptorProvider.ActionDescriptors.Items
            .OfType<ControllerActionDescriptor>()
            .Select(d => d.ControllerTypeInfo.AsType())
            .Distinct();
    }
}

方案2:扫描指定程序集筛选控制器类型

如果需要手动扫描程序集,可通过判断类型是否继承ControllerBase(API控制器)或Controller(MVC控制器)来筛选:

using System.Reflection;
using Microsoft.AspNetCore.Mvc;

public IEnumerable<Type> ScanControllersFromAssembly(string assemblyName)
{
    // 加载目标程序集,也可使用Assembly.GetEntryAssembly()获取入口程序集
    var assembly = Assembly.Load(assemblyName);
    return assembly.GetTypes()
        .Where(t => typeof(ControllerBase).IsAssignableFrom(t) && !t.IsAbstract);
}

二、System.Web.HttpContext.Current的替代方案

.NET Core中移除了System.Web.HttpContext.Current,改用IHttpContextAccessor通过依赖注入获取HttpContext:

1. 注册服务

在项目启动类中注册IHttpContextAccessor:

// .NET 6+ Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpContextAccessor(); // 注册服务

// .NET Core 3.1 Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    // 其他服务配置
}

2. 注入并使用

在需要访问HttpContext的类中注入IHttpContextAccessor,注意HttpContext可能为null(非请求上下文场景),需做空检查:

using Microsoft.AspNetCore.Http;

public class HttpContextHelper
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public HttpContextHelper(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public string GetCurrentUserId()
    {
        var context = _httpContextAccessor.HttpContext;
        if (context == null) return null;
        
        return context.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
    }
}

内容的提问来源于stack exchange,提问作者Lucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:01:15