我正在寻找在ASP控制器中隐藏动作方法的简单方便的方法。净的核心。
由于某种原因,很难找到一个完整而令人满意的答案。
例如,我想在给定环境值(即IWebHostEnvironment.EnvironmentName != Development
)的特定控制器中隐藏特定动作方法。
我知道ServiceFilterAttribute,但这是防止方法执行的方法,我更喜欢从任何地方(如我所说,有条件地)完全删除action方法,包括生成的swagger模式。类似于NonAction
属性,但在运行时条件下工作。不过,如果可能的话,我更喜欢使用自定义属性来修饰动作方法。
有谁知道实现这种行为的方便方法吗?
我认为你应该能够创建一个自定义的IApplicationModelConvention
public class RemoveActionConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
var toBeRemoved = new List<ActionModel>();
foreach (var action in controller.Actions)
{
if (ShouldBeRemoved(action))
{
toBeRemoved.Add(action);
}
}
foreach (var action in toBeRemoved)
{
controller.Actions.Remove(action);
}
}
}
}
并将其添加到MVC约定
services.AddMvc(options =>
{
options.Conventions.Add(new RemoveActionConvention());
});