2012-07-22 15 views
9

Jaki jest najlepszy sposób na warunkowe wyłączenie kontrolera ASP.NET MVC?Warunkowo wyłączyć kontroler ASP.NET MVC

Chcę mieć dostęp do działań kontrolera jeśli jakaś wartość w pliku web.config jest „true” i 404, czy to „false”

powinienem napisać własny atrybut?

UPDATE: Szukasz bardziej eleganckie rozwiązanie niż atrybut filtra działania (o zdolności do podejmowania nie stały parametr do konstruktora atrybut)

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

Odpowiedz

2

Najłatwiej byłoby prawdopodobnie wykorzystuje filtru niestandardowego działania:

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

można również warunkowo dodać trasę, która pasuje do tego kontrolera, który doprowadzi w zwrocie 404.

+0

dzięki. napisałem atrybut filtru akcji (zobacz mój komentarz). ale może istnieje bardziej eleganckie rozwiązanie? –

+0

Nie znam twojego celu tutaj, ale może najlepiej nie robić tego na poziomie aplikacji? Zastanawiam się, używając modułu IIS urr -writerrite do ustawienia reguł dla tras, które chcesz zwrócić. 404. Spójrz na poniższe przykłady: http: //blogs.iis.net/ruslany/archive/2009/04/ 08/10-url-przepisywanie-tips-and-tricks.aspx – igz168

+0

nie. Muszę mieć możliwość przełączenia go z pliku web.config. –

0

Crosspost od: https://stackoverflow.com/a/43044667/257470

Moje rozwiązanie dla wyłączenie ApiController Kontroler:

  • Używa webconfig AppSettings config flagę zamiast (#if DEBUG)
  • Przed metoda jest wywoływana ExecuteAsync przechwytuje inwokacji i kontrole cecha przełącz (flaga opcji);
  • jeśli funkcja jest wyłączona, zwraca HTTP 410 GONE
  • Jeśli jest wspólna dla wielu sterowników przenieść kod do klasy bazowej sterownika

kodu:

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); 
    } 
Powiązane problemy