在ASP.NET 6.0 Web API中动态更改路由



我想取一个环境变量,并将其作为所有控制器的路由的前缀。因此,在控制器中,我有以下内容:

[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);
}
}

相关内容

  • 没有找到相关文章

最新更新