有条件地禁用ASP.NET MVC控制器

时间:2012-07-22 23:17:58

标签: c# asp.net .net asp.net-mvc asp.net-mvc-3

有条件地禁用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);
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

最简单的可能是实现自定义操作过滤器:

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

您还可以有条件地添加与该控制器匹配的路由,该路由将导致返回404。

答案 1 :(得分:1)

在这里回答-Prevent ASP.NET Core discovering Controller in separate assembly

这种方法不需要过滤器,并且可以避免招摇等隐藏控制器。

答案 2 :(得分:0)

来自:https://stackoverflow.com/a/43044667/257470

的交叉发布

我的禁用ApiController控制器的解决方案:

  • 使用WebConfig AppSettings配置标志而不是(#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);
    }