You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:19:53