【问题标题】:Conditionally disable ASP.NET MVC Controller有条件地禁用 ASP.NET MVC 控制器
【发布时间】:2012-07-21 05:32:30
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。已经写了动作过滤器属性(见我的评论)。但也许存在一些更优雅的解决方案?
    • 我不知道你在这里的目的,但也许最好不要在应用程序级别这样做?我正在考虑使用 IIS url-rewrite 模块为您希望返回 404 的路由设置规则。请看下面的示例:blogs.iis.net/ruslany/archive/2009/04/08/…
    • 没有。我需要能够从 web.config 文件中切换它。
    • url-rewrite的规则保存在web.config中
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-02-11
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 2010-12-03
        相关资源
        最近更新 更多