.NET 6中迁移Startup.cs至Program.cs构建失败解决方案
问题:.NET 6下ASP.NET Core Web API构建失败的修复方案
问题背景
原本基于ASP.NET Core 5的教程代码依赖Startup.cs,但.NET 6采用了最小托管模型,Startup.cs被废弃。自行编写的.NET 6版Program.cs无法构建,需要适配调整。
现有代码的核心问题
- 缺失旧
Startup.cs中关键服务注册:AutoMapper和DbContext(EF Core上下文) - 直接使用
SqlCommand写原生SQL存在SQL注入风险,且与EF Core的ORM设计脱节 - CORS中间件位置错误,未在路由前配置
- 未保留原有的认证/授权中间件逻辑
- 硬编码创建表的逻辑不符合生产规范(应使用EF Core迁移)
- 端点命名与实体不匹配(如
GetPersons对应Service实体)
修正后的完整Program.cs代码
using fixit.Data; using fixit.Models; using AutoMapper; using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Authentication; var builder = WebApplication.CreateBuilder(args); // 1. 注册EF Core上下文(复用原Startup的配置逻辑) builder.Services.AddDbContext<DataContext>(opt => opt.UseSqlServer(builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING"))); // 2. 注册AutoMapper builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); // 3. 注册控制器和仓储服务 builder.Services.AddControllers(); builder.Services.AddScoped<IRepository<Service>, ServiceRepository>(); // 4. 配置Swagger文档支持 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // 5. 配置CORS策略(与原Startup规则一致) builder.Services.AddCors(options => { options.AddPolicy("allowedOrigin", policy => policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); }); var app = builder.Build(); // 开发环境启用SwaggerUI if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 中间件执行顺序必须严格遵循:CORS → HTTPS → 路由 → 认证 → 授权 → 控制器/端点 app.UseCors("allowedOrigin"); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 映射控制器路由(原Startup的核心路由逻辑) app.MapControllers(); // 可选:保留最小API端点,改用EF Core实现(避免SQL注入) app.MapGet("/api/services", async (DataContext db) => { return await db.Services.Select(s => new { s.Id, s.ServiceName, s.Description }).ToListAsync(); }) .WithName("GetServices") .WithOpenApi(); app.MapPost("/api/services", async (Service service, DataContext db) => { db.Services.Add(service); await db.SaveChangesAsync(); return Results.Created($"/api/services/{service.Id}", service); }) .WithName("CreateService") .WithOpenApi(); app.Run();
关键调整说明
- 补全依赖注册:添加了
DbContext和AutoMapper的服务注册,确保与原教程的依赖体系一致 - 规范中间件顺序:按照.NET 6官方要求的中间件执行顺序配置,避免逻辑冲突
- 消除安全风险:将原生SQL替换为EF Core的LINQ查询,彻底规避SQL注入问题
- 优化开发规范:修正端点命名与实体的匹配关系,仅在开发环境启用Swagger
- 推荐生产方案:删除硬编码建表逻辑,改用EF Core迁移命令管理数据库结构:
Add-Migration InitialCreate Update-Database
内容的提问来源于stack exchange,提问作者user21497668
相关产品推荐
相关产品推荐

