.NET Hosting报错:Microsoft.AspNetCore.Hosting.IStartup不受支持
问题排查与修复
错误原因
你混用了ASP.NET Core 6+的WebApplication构建模式和旧版的Startup类模式:
UseStartup<StartupBase>在新的WebApplication流程中已被废弃,不再支持IStartup接口,直接触发NotSupportedException。- 代码中重复构建了两个主机实例(
app和host),且同时调用app.Run()和host.Run(),导致运行时冲突。
修复方案
删除旧的Startup模式相关代码,将数据库迁移逻辑整合到当前的WebApplication构建流程中,具体修改如下:
修复后的完整代码
using System.Net; using System.Text; using DatingApp.API.Data; using DatingApp.API.Helpers; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Diagnostics; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; namespace DatingApp.API { class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddDbContext<DataContext>(options => { options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }); builder.Services.AddCors(x => x.AddPolicy("corsapp", builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); })); builder.Services.AddScoped<IAuthRepository, AuthRepository>(); builder.Services.AddScoped<IDatingRepository, DatingRepository>(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8 .GetBytes(builder.Configuration.GetSection("AppSettings:Token").Value)), ValidateIssuer = false, ValidateAudience = false }; }); var app = builder.Build(); // 执行数据库迁移和种子数据填充 using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService<DataContext>(); context.Database.Migrate(); Seed.SeedUsers(context); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "迁移过程中发生错误"); } } // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } else { app.UseExceptionHandler(builder => { builder.Run(async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; var error = context.Features.Get<IExceptionHandlerFeature>(); if (error != null) { // 修正扩展方法的大小写问题 context.Response.AddApplicationError(error.Error.Message); await context.Response.WriteAsync(error.Error.Message); } }); }); } // app.UseHttpsRedirection(); app.UseRouting(); app.UseCors("corsapp"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } } }
额外修正点
- 修正了数据库连接字符串的读取方式:将
options.UseSqlServer("DefaultConnection")改为options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")),确保正确读取配置文件中的连接字符串。 - 修正了扩展方法的拼写错误:
context.Response.addApplicationError改为context.Response.AddApplicationError(符合C#命名规范)。
内容的提问来源于stack exchange,提问作者Youssef Alamrousy
相关产品推荐
相关产品推荐

