.NET 8简易API控制器访问报404未找到,原因是什么?
问题描述
我用.NET 8创建了一个简易项目,编写了如下InterestsController控制器代码:
using Microsoft.AspNetCore.Mvc; namespace WebApi.Controllers { [ApiController] [Route("api/[controller]")] public class InterestsController : ControllerBase { private readonly ILogger<InterestsController> _logger; public InterestsController(ILogger<InterestsController> logger) { _logger = logger; } [HttpGet("GetInterests")] public ActionResult GetInterests() { _logger.LogInformation("GetInterests method called: "); return Ok("interests"); } } }
访问http://localhost:5264/api/interests/GetInterests时返回404,更换端口、使用不同工具甚至Swagger都无法识别该接口,这是为什么?是否是.NET 8的问题?
相关配置如下:
program.cs代码
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.Run();
launchSettings.json配置
{ "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:11726", "sslPort": 44386 } }, "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:5264", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "https": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "https://localhost:7201", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:7204;", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
问题原因
不是.NET 8的问题,你使用的是最小API模板创建项目,该模板默认不会自动注册控制器服务和映射控制器路由。你的控制器代码本身没有问题,但框架并未加载该控制器,导致访问返回404,Swagger也无法识别接口。
解决方法
修改program.cs,添加两项关键配置:
- 在添加Swagger服务之前,注册控制器服务:
builder.Services.AddControllers(); - 在Swagger中间件之后、
app.Run()之前,映射控制器路由:app.MapControllers();
修改后的program.cs代码:
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务 builder.Services.AddControllers(); // 添加Swagger相关服务 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 开发环境启用Swagger if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 映射控制器路由 app.MapControllers(); app.Run();
修改完成后重新运行项目,即可正常访问接口,Swagger也会显示该接口。
内容的提问来源于stack exchange,提问作者Social Circle
相关产品推荐
相关产品推荐

