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

ASP.NET Core 8 Web API添加控制器后端点无法识别的问题

问题:ASP.NET Core 8 Web API控制器端点无法被Swagger识别

我首次使用.NET 8构建ASP.NET Core 8 Web API项目,编写了CouponAPIController控制器,但运行Swagger或Postman时无法找到该端点。删除Program.cs中的WeatherForecast代码后,Swagger仍无内容显示。

相关代码

Program.cs

using Mango.Services.CouponAPI.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddDbContext<AppDbContext>(option =>
{
    option.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
ApplyMigration();

void ApplyMigration()
{
    using (var scope = app.Services.CreateScope())
    {
        var _db = scope.ServiceProvider.GetRequiredService<AppDbContext>();

        if (_db.Database.GetPendingMigrations().Count() > 0)
        {
            _db.Database.Migrate();
        }
    }
}

var summaries = new[]
{
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

app.MapGet("/weatherforecast", () =>
    {
        var forecast = Enumerable.Range(1, 5).Select(index =>
                new WeatherForecast
                (
                    DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                    Random.Shared.Next(-20, 55),
                    summaries[Random.Shared.Next(summaries.Length)]
                ))
            .ToArray();
        return forecast;
    })
    .WithName("GetWeatherForecast");

app.Run();

record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

CouponAPIController.cs

using System.Collections;
using Mango.Services.CouponAPI.Data;
using Mango.Services.CouponAPI.Models;
using Microsoft.AspNetCore.Mvc;

namespace Mango.Services.CouponAPI.Controller;

[Route("api/[controller]")]
[ApiController]
public class CouponAPIController : ControllerBase
{
    private readonly AppDbContext _db;

    public CouponAPIController(AppDbContext db)
    {
        _db = db;
    }

    [HttpGet]
    public object GetCoupon()
    {
        try
        {
            IEnumerable<Coupon> couponList = _db.Coupons.ToList();
            return couponList;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

问题原因及解决方案

核心问题:未注册控制器服务并映射路由

你使用的是最小API模板创建的项目,默认不会自动添加控制器相关的服务注册和路由映射,导致框架无法识别你编写的控制器类。

解决步骤:

  1. 在Program.cs中添加控制器服务注册
    在builder.Services.AddSwaggerGen();之前添加:
builder.Services.AddControllers();

这一步会把控制器相关的服务注入到DI容器中,让框架能发现你的控制器。

  1. 在请求管道中添加控制器路由映射
    在app.UseHttpsRedirection();之后添加:
app.MapControllers();

这一步会将控制器的端点路由添加到请求处理管道中,确保HTTP请求能正确匹配到控制器的Action方法。

  1. (可选)修正控制器命名空间
    你的控制器命名空间是Mango.Services.CouponAPI.Controller(单数),通常规范是用复数Controllers,虽然这不是导致端点无法识别的直接原因,但建议修正为:
namespace Mango.Services.CouponAPI.Controllers;
  1. (可选)优化Action返回类型
    当前GetCoupon方法返回object类型,Swagger无法准确识别返回模型,建议改为强类型返回并使用IActionResult:
[HttpGet]
public IActionResult GetCoupon()
{
    try
    {
        IEnumerable<Coupon> couponList = _db.Coupons.ToList();
        return Ok(couponList);
    }
    catch (Exception ex)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
    }
}

这样Swagger会自动生成更清晰的接口文档,同时提供更规范的HTTP状态码。

完成以上修改后,重新运行项目,Swagger就能正常显示api/CouponAPI的端点了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:33:24