Skip to content

ASP.NET Core 8 启动配置:StartUp.cs 与 Program.cs

问题背景

当从传统的 ASP.NET MVC(基于 .NET Framework)迁移到 ASP.NET Core 8 时,许多开发者注意到项目模板不再自动生成 StartUp.cs 文件。这引发了两个核心疑问:

  1. StartUp.cs 在 .NET 8 中是否已被弃用?
  2. 如果不再使用 StartUp.cs,如何配置关键功能如 OAuth、中间件和服务依赖?

在 .NET Framework 中,StartUp.cs 是 OWIN 管道的核心配置点,但在 ASP.NET Core 8 中,配置机制发生了重要演变。

解决方案概览

核心理念

ASP.NET Core 8 完全支持 StartUp.csProgram.cs 两种配置模式:

  • 推荐方式:使用 Program.cs 统一配置(默认模板采用此方式)
  • 兼容方式:保留 StartUp.cs 分离配置(适用于旧项目迁移或复杂场景)

🚀 方式一:单一文件配置(Program.cs - 推荐方案)

.NET 6+ 引入了最小宿主模型,将配置集中到 Program.cs 中。以下是包含 OAuth 配置的完整示例:

cs
var builder = WebApplication.CreateBuilder(args);

// 服务注册
builder.Services.AddControllersWithViews();
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = "OAuthProvider"; // 自定义认证方案名
})
.AddCookie()
.AddOAuth("OAuthProvider", options => 
{
    options.ClientId = builder.Configuration["OAuth:ClientId"];
    options.ClientSecret = builder.Configuration["OAuth:ClientSecret"];
    options.AuthorizationEndpoint = "https://oauth-provider.com/authorize";
    options.TokenEndpoint = "https://oauth-provider.com/token";
    options.CallbackPath = "/oauth-callback";
});

var app = builder.Build();

// 中间件管道配置
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // 启用认证
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

关键配置解析

  1. 认证服务注册
    通过 AddAuthentication() 配置认证方案,链式调用 AddOAuth() 设置 OAuth 参数
  2. 管道顺序
    UseRouting() 必须出现在 UseAuthentication()UseAuthorization() 之前
  3. 配置来源
    builder.Configuration 自动加载 appsettings.json,避免硬编码敏感信息

常见错误

中间件顺序错误会导致认证失效:

cs
// ❌ 错误顺序
app.UseAuthentication();
app.UseRouting();

// ✅ 正确顺序
app.UseRouting();
app.UseAuthentication();

🧩 方式二:分离配置文件(StartUp.cs - 传统方案)

虽不再是默认模式,但仍可显式启用 StartUp.cs 分离配置:

cs
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>(); // 启用Startup类配置
            });
}
cs
public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddAuthentication(...)
                .AddOAuth(...); // 注册认证服务
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

适用场景

  • 大型项目需要分离关注点
  • 迁移旧版 ASP.NET Core 项目(<5.0)
  • 需通过构造函数注入特殊配置逻辑

核心概念解读

🔄 配置演进脉络

.NET Core 版本配置模式
1.x-3.xStartup.cs 必选
5.x两种模式并存
6.0+Program.cs 首选

⚖️ 选型建议

场景推荐方案
新项目开发Program.cs
小型/中型应用Program.cs
大型企业级应用Startup.cs
旧版迁移(<5.0)Startup.cs

🌐 配置加载机制

无论采用哪种模式,以下组件行为一致:

  • 配置系统:自动加载 appsettings.json 和环境变量
  • 依赖注入builder.ServicesStartup.ConfigureServices 完全等效
  • 中间件管道app.{UseXxx}() 的调用顺序决定处理流程

迁移路径

从传统 ASP.NET 迁移时:

  1. Configuration 方法迁移到 UseXxx() 中间件调用
  2. Startup.ConfigureServices 内容转移到 builder.Services
  3. 删除 app.UseMvc(),改用端点路由映射

总结与最佳实践

  1. 现代方案优先
    新项目应采用 Program.cs 单一文件模式,减少文件跳转,提高可读性

  2. 谨慎选择分离模式
    仅当以下情况保留 Startup.cs

    • 项目超过 20 个服务注册
    • 需复杂的条件初始化逻辑
    • 维护旧版 ASP.NET Core 项目
  3. 关键配置规则

  4. 认证配置要点

    • OAuth 参数必须匹配提供商的认证端点
    • 通过 IConfiguration 管理客户端密钥等敏感数据
    • 回调路径需在 OAuth 提供商处注册

两种模式在功能上完全等效,选择取决于项目规模和团队偏好。随着 .NET 版本更新,Program.cs 将成为更主流的配置方式。