有条件地禁用ASP.NET MVC控制器
有条件地禁用ASP.NET MVC控制器的最佳方法是什么?
如果web.config中的某些值为“true”,我希望能够访问控制器操作,如果是“false”,则我想访问404
我应该写自己的属性吗?
更新 :寻找比动作filter属性更优雅的解决方案(能够将非常量参数传递给属性构造函数)
[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); } } }
最简单的可能是实现自定义操作filter:
您还可以有条件地添加与该控制器匹配的路由,该路由将导致返回404。
交叉发布自: https : //stackoverflow.com/a/43044667/257470
我的禁用ApiController
控制器的解决方案:
- 使用WebConfig AppSettings配置标志而不是(
#if DEBUG
) - 在调用方法之前,
ExecuteAsync
拦截调用并检查特征切换(特征标志); - 如果禁用function,则返回
HTTP 410 GONE
- 如果它对许多控制器很常见,请将代码移动到控制器的基类
代码:
public class TestController : ApiController { public override Task 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); }