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

ASP.NET Core 8是否使用StartUp.cs?迁移时配置操作咨询

.NET 8 迁移:StartUp.cs 的变化与配置替代方案

一、StartUp.cs 去哪了?

从.NET Core 3.0开始(涵盖.NET 5至.NET 8),官方不再默认生成StartUp.cs——这是启动配置惯例的简化优化,并非彻底移除该类的功能。当前框架推荐使用Program.cs的顶级语句模式,将原StartUp.cs中的服务注册、中间件配置逻辑全部整合到同一文件中。若你偏好旧模式,仍可手动创建StartUp.cs并在Program.cs中调用,但官方更推荐简洁的新写法。

二、原 StartUp 中配置的迁移方法

1. 服务注册(对应原ConfigureServices方法)

直接在Program.cs中通过builder.Services操作,用法和原IServiceCollection完全一致,可完成依赖注入、认证服务注册等操作。

2. 中间件管道配置(对应原Configure方法)

通过app对象添加中间件,需注意中间件执行顺序和原要求保持一致(例如认证中间件要放在授权中间件之前)。

3. OAuth 配置示例

以OAuth 2.0认证配置为例,展示迁移前后的代码变化:

原.NET Framework中StartUp.cs的代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = "MyOAuth";
    })
    .AddCookie()
    .AddOAuth("MyOAuth", options =>
    {
        options.ClientId = "your-client-id";
        options.ClientSecret = "your-client-secret";
        options.CallbackPath = "/signin-oauth";
        options.AuthorizationEndpoint = "https://your-provider.com/oauth/authorize";
        options.TokenEndpoint = "https://your-provider.com/oauth/token";
        options.UserInformationEndpoint = "https://your-provider.com/oauth/userinfo";
        // 自定义用户信息映射逻辑
    });
}

public void Configure(IApplicationBuilder app)
{
    app.UseAuthentication();
    app.UseAuthorization();
    // 其他中间件如路由、静态文件等
}

迁移至.NET 8的Program.cs代码:

var builder = WebApplication.CreateBuilder(args);

// 服务注册部分
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = "MyOAuth";
})
.AddCookie()
.AddOAuth("MyOAuth", options =>
{
    // 建议从配置文件读取敏感信息,避免硬编码
    options.ClientId = builder.Configuration["OAuthSettings:ClientId"];
    options.ClientSecret = builder.Configuration["OAuthSettings:ClientSecret"];
    options.CallbackPath = "/signin-oauth";
    options.AuthorizationEndpoint = "https://your-provider.com/oauth/authorize";
    options.TokenEndpoint = "https://your-provider.com/oauth/token";
    options.UserInformationEndpoint = "https://your-provider.com/oauth/userinfo";
    
    // 原有的自定义用户信息映射逻辑
    options.Events = new OAuthEvents
    {
        OnCreatingTicket = async context =>
        {
            var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

            var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
            response.EnsureSuccessStatusCode();

            var user = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
            context.Identity.AddClaim(new Claim(ClaimTypes.Name, user.GetProperty("name").GetString()));
        }
    };
});

builder.Services.AddAuthorization();
builder.Services.AddControllersWithViews();

var app = builder.Build();

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

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

// 注意顺序:认证在前,授权在后
app.UseAuthentication();
app.UseAuthorization();

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

app.Run();

三、坚持使用 StartUp.cs 的方法

若你习惯旧模式,可手动创建StartUp.cs:

public class Startup
{
    public IConfiguration Configuration { get; }

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

    public void ConfigureServices(IServiceCollection services)
    {
        // 原有的服务注册逻辑,包括OAuth配置
        services.AddControllersWithViews();
        services.AddAuthentication(...)
            .AddCookie()
            .AddOAuth(...);
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 原有的中间件配置逻辑
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();

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

然后在Program.cs中调用:

var builder = WebApplication.CreateBuilder(args);
var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services);

var app = builder.Build();
startup.Configure(app, app.Environment);

app.Run();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:56:25