使用自定义中间件后GET请求返回404,.NET Core技术问题求助
解决.NET Core自定义ApiKey中间件导致404的问题
兄弟,我之前也踩过这个一模一样的坑!你遇到的404问题,十有八九是你的ApiKeyMiddleWare没有正确把请求传递到后续的中间件管道里,导致请求根本没到达路由匹配环节,自然返回404了。
核心问题:忘记调用管道的下一个中间件
自定义中间件的InvokeAsync方法里,必须在校验通过后调用await next(context),否则请求会在你的中间件这里被截断,无法到达后面的路由、控制器逻辑。
给你一个正确的中间件示例参考:
public class ApiKeyMiddleWare { private readonly RequestDelegate _next; public ApiKeyMiddleWare(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 检查请求头中的user-key字段 if (!context.Request.Headers.TryGetValue("user-key", out var apiKey)) { context.Response.StatusCode = StatusCodes.Status400BadRequest; await context.Response.WriteAsync("请求头缺少必填的user-key字段"); return; // 校验失败,直接返回,不调用后续中间件 } // 校验通过!一定要调用_next把请求传给下一个中间件 await _next(context); } }
如果你的代码里没有await _next(context)这一行,赶紧加上——这是最常见的触发原因。
次要检查点:中间件的注册顺序
.NET Core中间件的执行顺序非常关键,你的ApiKeyMiddleWare需要放在正确的位置:
- 可以放在
app.UseRouting()之前(对所有进入管道的请求做校验),也可以放在UseRouting之后、UseEndpoints()之前,但绝对不能放在UseEndpoints之后(因为请求到这里已经结束了,中间件根本不会被触发)。
给你一个正确的Startup.cs的Configure方法示例:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); // 注册你的ApiKey中间件,位置要在路由相关中间件之前或中间 app.UseMiddleware<ApiKeyMiddleWare>(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
额外排查项
如果上面两点都没问题,那可以检查下:
- 你的中间件有没有意外修改了
context.Request.Path或者其他请求属性,导致路由无法匹配到对应的控制器; - 有没有在校验通过后做了其他截断请求的操作(比如提前调用了
context.Response.CompleteAsync())。
如果还是解决不了,把你的ApiKeyMiddleWare.cs和Startup.cs的完整代码贴出来,我再帮你仔细排查!
内容的提问来源于stack exchange,提问作者MistaJoe
相关产品推荐
相关产品推荐

