【问题标题】:Replace custom placeholder in attribute routing in .NET CORE在 .NET CORE 中替换属性路由中的自定义占位符
【发布时间】:2026-01-15 00:05:02
【问题描述】:

如何在.Net Core 2.1 中的每条路线之前替换自定义占位符

例如{serverkey}

[Route("api/{serverkey}/[controller]")]
    [ApiController]
    [AuthorizationFilter]
    public class MonitoringController : Controller
    {
        // Code...
    }

我希望每个网址都像 api/key/Monitoring/Action。所以我需要在每个请求/路由中替换键。

所以基本上有什么办法可以在每个请求映射到这个控制器之前替换占位符{serverkey} 或类似{serverkey:key} 甚至[serverkey]

我知道有一种方法,例如 [controller] 会自动替换为 .net core,但我找不到。

提前致谢。

【问题讨论】:

  • {serverKey} 值从何而来?
  • 替换是什么意思?将[Route("api/{serverkey}/[controller]")] 属性放在控制器顶部,并在操作方法中访问该值(例如[HttpGet] public string Get(string serverkey))还不够吗?
  • 我在 appsetting.json 中添加了serverKey。但是我需要找到一种方法来用这个键替换路由占位符。
  • @Voodoo url 中提供的serverkey 与 appsettings 文件中的不匹配会发生什么情况?我认为您可以使用自定义 AuthorizeAttribute 来解决这个问题
  • @bmartins 我不想从输入中获取密钥,但我希望将我的路由替换为我自己存储的密钥。

标签: c# asp.net-core .net-core routing asp.net-core-webapi


【解决方案1】:

我可以使用IRouteTemplateProvider 创建自定义route

public class CustomRouteAttribute : Attribute, IRouteTemplateProvider
    {
        string serverKey = string.Empty;

        public CustomRouteAttribute()
        {
            string serverKey = "Your Key";
        }

        public string Template => $"api/{serverKey}/[controller]";

        public int? Order { get; set; }

        public string Name { get; set; }
    }

它会在每个 route 之前添加您的密钥。

用法:在您的controller 上将此用作attribute

//[Route("api/[controller]")]
    [CustomRoute]
    [ApiController]
    public class DemoController : ControllerBase
    {}

对于示例

http://localhost:52264/api/Controller/Action 将变为 http://localhost:52264/api/Yourkey/Controller/Action

【讨论】: