2012-07-22 56 views
9

有條件禁用ASP.NET MVC控制器的最佳方法是什麼?有條件地禁用ASP.NET MVC控制器

我希望有控制器動作的訪問,如果在web.config中的一些值是「真」和404,如果它是「假」

我應該寫我自己的屬性?

UPDATE: 尋找不如行動過濾屬性更優雅的解決方案(與通過不恆定的參數屬性構造的能力)

[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); 
      } 
     } 
    } 

回答

2

最簡單的很可能是實現自定義的行爲過濾器:

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

您也可以有條件地補充說,該控制器將導致匹配的路由在404被返回。

+0

感謝。已經寫了action filter屬性(請參閱我的評論)。但也許存在一些更優雅的解決方案? – 2012-07-23 01:16:32

+0

我不知道你在這裏的目的,但也許最好不要在應用程序級別這樣做?我正在考慮使用IIS url-rewrite模塊來爲你想要返回的路由設置404規則。看看下面的例子:http://blogs.iis.net/ruslany/archive/2009/04/ 08/10-url-rewriting-tips-and-tricks.aspx – igz168 2012-07-23 02:23:22

+0

沒有。我需要能夠從web.config文件切換它。 – 2012-07-23 02:26:00

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); 
    }