ASP.NET Core 8:如何对/api外的所有POST请求返回404?
解决方案:拦截非/api路径的POST请求返回404
可以通过在SPA中间件之前添加自定义中间件的方式实现,直接拦截所有未被/api前缀匹配的POST请求并返回404响应,避免SPA中间件尝试处理这类无效请求而抛出异常。
实现代码(以ASP.NET Core为例)
在Program.cs的中间件管道中,将自定义拦截逻辑放在SPA中间件之前:
var app = builder.Build(); // 自定义拦截中间件:处理非/api的POST请求 app.Use(async (context, next) => { // 判断条件:POST方法 + 路径不以/api开头 if (context.Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase) && !context.Request.Path.StartsWithSegments("/api")) { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync("404 Not Found"); return; } // 符合要求的请求继续执行后续中间件 await next(); }); // 常规中间件配置 app.UseStaticFiles(); app.UseRouting(); // API控制器路由 app.MapControllers(); // SPA应用配置(针对/en/*路径) app.MapWhen(context => context.Request.Path.StartsWithSegments("/en"), spaApp => { spaApp.UseSpa(spaBuilder => { spaBuilder.Options.DefaultPage = "/en/index.html"; // 根据你的SPA框架添加其他配置,比如开发环境的热重载等 }); }); app.Run();
逻辑说明
- 自定义中间件会优先处理所有请求,先判断请求方法是否为POST,同时路径是否不属于/api前缀范围。
- 符合条件的无效POST请求会直接返回404状态码和清晰的响应内容,不会流转到SPA中间件。
- 正常的API请求(/api/*下的POST)和SPA的GET请求会继续执行后续中间件,不受影响。
如果后续需要允许特定非/api路径的POST请求,只需在判断条件中添加排除规则即可,例如:
// 排除允许POST的特定路径 if (context.Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase) && !context.Request.Path.StartsWithSegments("/api") && !context.Request.Path.StartsWithSegments("/en/allowed-post-endpoint"))
内容的提问来源于stack exchange,提问作者neoky
相关产品推荐
相关产品推荐

