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
相关产品推荐
相关产品推荐

