我正在将ASP.NET Core 3.1用于我的Web API。我有多个控制器都使用基于属性的路由,一切都很好。
我们希望能够在应用程序配置中使用功能标记切换一个或多个控制器。理想情况下,如果未设置标志,则在API看来,相应的控制器应该不再存在。我正在尝试提出最佳(或任何一种)方法。
[似乎没有内置的方法来配置使用属性路由时扫描哪些控制器,也没有办法修改路由发现的控制器或端点的集合。这是有问题的Startup.cs代码段:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
app.UseRouting();
app.UseEndpoints(e =>
{
if (!this.FeatureEnabled)
{
// DO SOMETHING?
}
e.MapControllers();
});
}
[我意识到我可能可以切换到更手动的手写路由,并在Startup类中指定每个控制器,动作和参数,但是我会比沿着那条凌乱的路径早放弃此功能标志要求。
使用基于属性的路由时,是否可以选择在API中使用哪些控制器?
您可以实现自己的ControllerFeatureProvider
并决定要在应用程序中使用哪些控制器。
public class CustomControllerFeatureProvider : ControllerFeatureProvider
{
private readonly IConfiguration _configuration;
public CustomControllerFeatureProvider(IConfiguration configuration)
{
_configuration = configuration;
}
protected override bool IsController(TypeInfo typeInfo)
{
var isController = base.IsController(typeInfo);
if (isController)
{
var enabledController = _configuration.GetValue<string[]>("EnabledController");
isController = enabledController.Any(x => typeInfo.Name.Equals(x, StringComparison.InvariantCultureIgnoreCase));
}
return isController;
}
}
并将其添加到startup.cs中
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.ConfigureApplicationPartManager(manager =>
{
manager.FeatureProviders.Add(new CustomControllerFeatureProvider(_configuration));
});
}