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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:07:03