.NET Core中Program.cs端点正常但控制器/api/greet返回404
问题现象
- 运行在Proxmox Debian CT上的.NET Core测试程序,地址
192.168.1.200:5000 /test端点可正常访问(返回200 OK)/api/greet端点返回404 Not Found,控制器未初始化(构造函数中的Console.WriteLine无输出)
相关代码
Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.MapGet("/test", () => "Test route reached"); app.Run();
Controller.cs
namespace HelloWorldApi.Controllers { [ApiController] [Route("api")] public class HelloWorldController : ControllerBase { [HttpGet("greet")] public IActionResult GetGreeting() { return Ok("Hello World"); } } }
排查与解决方案
1. 确保控制器程序集被扫描到
.NET Core默认扫描AddControllers所在程序集的控制器,若控制器在其他程序集或扫描范围异常,需显式指定:
修改Program.cs中的服务配置:
builder.Services.AddControllers() .AddApplicationPart(typeof(HelloWorldApi.Controllers.HelloWorldController).Assembly);
2. 简化路由配置(适配.NET 6+模型)
.NET 6+的WebApplication已简化路由逻辑,替换原有的UseRouting+UseEndpoints写法,避免中间件顺序问题:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); // 替换原路由配置,直接映射控制器 app.MapControllers(); app.MapGet("/test", () => "Test route reached"); app.Run();
3. 检查部署文件完整性
确认Debian CT上的部署目录包含完整的程序文件:
- 本地执行
dotnet publish后,将publish目录下所有文件复制到CT中 - 确保部署目录存在对应项目名称的dll文件(如
HelloWorldApi.dll)
4. 启用日志排查启动过程
在Program.cs中添加控制台日志,查看控制器是否被加载:
var builder = WebApplication.CreateBuilder(args); // 启用控制台日志输出 builder.Logging.AddConsole(); builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.MapGet("/test", () => "Test route reached"); app.Run();
启动程序后,检查控制台输出,若看到类似以下日志,说明控制器端点已成功注册:
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0] Registered endpoint 'HTTP: GET /api/greet'
5. 确认控制器基础配置
- 控制器类必须为
public访问修饰符(你的代码已满足) - 若控制器在独立项目中,需确保主项目已添加该项目的引用,并在
AddControllers中指定其程序集
内容的提问来源于stack exchange,提问作者DaSomes
相关产品推荐
相关产品推荐

