2012-07-22 14 views
9

¿Cuál es la mejor manera de deshabilitar el controlador MVC de ASP.NET de forma condicional?Deshabilitar condicionalmente el controlador MVC de ASP.NET

Quiero tener un acceso a las acciones del controlador si algún valor en web.config es "verdadero" y 404 si es "falsa"

¿Debo escribir mi propio atributo?

ACTUALIZACIÓN: Buscando solución más elegante que atributo de filtro de acción (con una capacidad de pasar el parámetro no es constante a atribuir constructor)

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

Respuesta

2

Lo más fácil sería probablemente para implementar un filtro de acción personalizada:

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

también puede agregar condicionalmente una ruta que coincida con el controlador que resultaría en un 404 siendo devuelto.

+0

gracias. he escrito el atributo de filtro de acción (ver mi comentario). pero tal vez exista una solución más elegante? –

+0

No conozco su propósito aquí, pero quizás sea mejor no hacerlo a nivel de aplicación. Estoy pensando en utilizar el módulo url-rewrite de IIS para configurar las reglas para las rutas que busca devolver 404. Observe los siguientes ejemplos: http: //blogs.iis.net/ruslany/archive/2009/04/ 08/10-url-rewriting-tips-and-tricks.aspx – igz168

+0

no. Necesito tener la capacidad de cambiarlo de un archivo web.config. –

0

envío cruzado de: https://stackoverflow.com/a/43044667/257470

Mi solución para inhabilitar ApiController controlador:

  • Usos bandera config WebConfig AppSettings en lugar de (#if DEBUG)
  • Antes método se invoca ExecuteAsync intercepta la invocación y cheques característica alternar (bandera de función);
  • si la función está desactivada, vuelve HTTP 410 GONE
  • Si es común para muchos controladores, mover el código a la clase base del controlador de

El código:

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