有条件地禁用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:

http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

您还可以有条件地添加与该控制器匹配的路由,该路由将导致返回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); }