有条件禁用ASP.NET MVC控制器(Conditionally disable ASP.NET

2019-06-26 11:00发布

什么是有条件地禁用ASP.NET MVC控制器的最佳方式?

我想有到控制器动作的访问,如果在web.config中的一些值是“真”和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);
            }
        }
    }

Answer 1:

最简单的很可能是实现自定义的行为过滤器:

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

您也可以有条件地补充说,该控制器将导致返回404相匹配的路由。



Answer 2:

从跨发帖: 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);
    }


文章来源: Conditionally disable ASP.NET MVC Controller