.NET可作为Windows服务运行的控制台应用REST API请求返回404,提示请求未被应用代码处理
.NET可作为Windows服务运行的控制台应用REST API请求返回404,提示请求未被应用代码处理
嘿,我看你遇到的问题挺典型的——做了个能当Windows服务跑的控制台应用,也搭了REST API,但请求http://localhost:5000/api/v1/article/1就是返回404,还提示请求走到中间件管道末尾都没被应用代码处理。我来给你拆解下问题和解决办法:
首先看你贴的Program.cs代码,你已经通过builder.Services.AddControllers()注册了控制器相关服务,但最关键的一步没做:在应用的中间件管道里配置路由和控制器的端点映射。.NET的中间件是按顺序执行的,如果没把控制器的端点映射加进去,请求根本到不了你的API控制器代码里,自然就会走到管道末尾返回404。
你需要把Program.cs补全中间件配置,修改后的大致结构应该是这样:
using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); builder.Configuration .AddJsonFile("schedules.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); var config = builder.Configuration; builder.Services.AddDbContext<MyApp.DAL.DataContext>(options => options.UseSqlServer(config.GetConnectionString("mydbconn"), b => b.MigrationsAssembly("MyApp.DAL"))); builder.Services.AddWindowsService(); builder.Services.AddControllers(); // 这里如果还有没写完的服务注册(比如你写了一半的AddTra...),正常保留就行 var app = builder.Build(); // 👇 这部分就是你大概率缺失的中间件配置 app.UseRouting(); // 如果你的API需要授权,就加上这行;不需要的话可以跳过 // app.UseAuthorization(); // 把控制器的端点映射到中间件管道里,让请求能找到对应的API方法 app.MapControllers(); app.Run();
为啥这步这么重要?因为AddControllers()只是把控制器的服务注册到了依赖注入容器里,但并没有告诉应用“要把进来的请求路由到控制器的API上”。只有通过MapControllers(或者配合UseRouting一起用),才能让请求被正确引导到你的/api/v1/article/1对应的控制器方法上。
另外还要多检查一步:你的Article控制器类有没有正确加路由特性?比如应该是类似这样的结构:
[ApiController] [Route("api/v1/[controller]")] public class ArticleController : ControllerBase { [HttpGet("{id}")] public IActionResult GetArticle(int id) { // 这里写你的业务逻辑 return Ok(new { Id = id, Title = "测试文章" }); } }
要是控制器上的[Route]或者方法上的[HttpGet("{id}")]配置错了,和你请求的URL不匹配,也会导致找不到处理方法返回404。
总结下你要做的两件核心事:
- 在
Program.cs里补全中间件的端点映射配置(也就是app.MapControllers()这部分) - 确认API控制器和方法上的路由特性和你请求的URL完全匹配
备注:内容来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

