我想取一个环境变量,并将其作为所有控制器的路由的前缀。因此,在控制器中,我有以下内容:
[ApiController]
[Route("[controller]")]
public class DashboardsController : ControllerBase
{.......}
Program.cs路由部分==>
app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.Run();
我尝试过创建一个带有常量字符串的类,并将其放入Route属性中,但正如您所知,我们无法更改常量,所以这没有奏效。
[Route]
属性实现了IRouteTemplateProvider
接口,该接口定义了返回路由模板的Template
属性。
如果您实现了一个以环境变量名为参数的自定义属性,例如[DynamicRoute]
,则可以根据传入的环境变量将Template
属性设置为不同的值。
这对我有效:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public sealed class DynamicRouteAttribute : Attribute, IRouteTemplateProvider
{
public DynamicRouteAttribute(string environmentVariableName)
{
ArgumentNullException.ThrowIfNull(environmentVariableName);
Template = Environment.GetEnvironmentVariable(environmentVariableName);
}
public string? Template { get; }
public int? Order { get; set; }
public string? Name { get; set; }
}
用[DynamicRoute("yourEnvVarName")]
替换控制器中的[Route("[controller]")]
,它将开始尊重您在环境变量中配置的任何内容。
@julealgon给出答案后,这就是最终解决方案。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public sealed class DynamicRouteAttribute : RouteAttribute
{
public DynamicRouteAttribute(string template)
: base($"{Environment.GetEnvironmentVariable("test")}/{template}")
{
ArgumentNullException.ThrowIfNull(template);
}
}