有条件地禁用ASP.NET MVC控制器的最佳方法是什么?
如果web.config中的某些值为“true”,我希望能够访问控制器操作,如果是“false”,则我想访问404
我应该写自己的属性吗?
更新: 寻找比动作过滤器属性更优雅的解决方案(能够将非常量参数传递给属性构造函数)
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class CloseForSomeSettingAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool mySettingValue = MySettingManager.GetMySettingValue();
if (mySettingValue)
{
filterContext.Result = new HttpStatusCodeResult(404);
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
答案 0 :(得分:3)
最简单的可能是实现自定义操作过滤器:
您还可以有条件地添加与该控制器匹配的路由,该路由将导致返回404。
答案 1 :(得分:1)
在这里回答-Prevent ASP.NET Core discovering Controller in separate assembly
这种方法不需要过滤器,并且可以避免招摇等隐藏控制器。
答案 2 :(得分:0)
来自:https://stackoverflow.com/a/43044667/257470
的交叉发布我的禁用ApiController
控制器的解决方案:
#if DEBUG
)ExecuteAsync
拦截调用并检查功能切换(功能标记); HTTP 410 GONE
代码:
public class TestController : ApiController
{
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
var featureFlag = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["EnableTest"]);
if (featureFlag == false)
{
return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Gone));
}
return base.ExecuteAsync(controllerContext, cancellationToken);
}