.NET Core中UsePathBase()为何原路由仍可用?
解决路径基准后原路由仍可访问的问题
app.UsePathBase("/admin")仅为请求路径添加基准前缀,不会自动拦截原路径的请求。要禁用localhost:5000/Product这类原路由,为前端路由腾出空间,这里提供两种实用方案:
方案一:用中间件拦截非基准路径的API请求
在UsePathBase之后添加自定义中间件,检查请求路径是否以/admin开头,若非静态文件且未匹配基准路径,直接返回404:
app.UsePathBase("/admin"); // 添加拦截中间件 app.Use(async (context, next) => { // 排除前端静态文件,可根据实际项目调整规则 var isStaticFile = context.Request.Path.Value.StartsWith("/css/") || context.Request.Path.Value.StartsWith("/js/") || context.Request.Path.Value.Equals("/index.html"); if (!isStaticFile && !context.Request.Path.StartsWithSegments("/admin")) { context.Response.StatusCode = StatusCodes.Status404NotFound; return; } await next(); }); // 后续路由配置,比如控制器映射 app.MapControllers();
方案二:给所有API路由统一添加前缀
直接在路由配置中为API添加/admin前缀,彻底废弃原路径路由:
全局配置方式
在Program.cs中统一设置路由前缀:
app.MapControllers() .WithMetadata(new RouteAttribute("admin/[controller]/[action]"));
控制器单独配置方式
在每个API控制器上添加路由前缀:
[Route("admin/[controller]")] public class ProductController : ControllerBase { // 路由将变为 /admin/Product [HttpGet] public IActionResult GetProducts() { return Ok(); } }
完成配置后,仅/admin/Product这类路径能访问API,原/Product路径因无匹配路由规则返回404,可直接用于前端路由。
内容的提问来源于stack exchange,提问作者dev.th
相关产品推荐
相关产品推荐

