5

Estoy anulando el método Controller.HandleUnknownAction (string actionName) de ASP.NET MVC. Se invoca cuando no se encuentra una acción y también cuando no se permite un método HTTP. ¿Cómo puedo distinguir entre los dos? Me gustaría devolver un 404 cuando no se encuentra una acción y 405 cuando se permite un método.ASP.NET MVC: Controller.HandleUnknownAction 404 o 405?

Respuesta

3

La manera más simple que puedo pensar es crear un filtro de acción personalizado. Esto le permitirá volver de estado HTTP resultado de código si no se permite el método

public class HttpPostFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!(filterContext.RequestContext.HttpContext.Request.GetHttpMethodOverride().Equals("post", StringComparison.InvariantCultureIgnoreCase))) 
     { 
      filterContext.Result = new HttpStatusCodeResult(405); 
     } 
    } 
} 

Lo mejor es crear la versión más genérico de la misma, al igual que AcceptVerbsAttribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class AllowMethodsAttribute : ActionFilterAttribute 
{ 
    public ICollection<string> Methods 
    { 
     get; 
     private set; 
    } 

    public AllowMethodsAttribute(params string[] methods) 
    { 
     this.Methods = new ReadOnlyCollection<string>(methods); 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride(); 
     if (!this.Methods.Contains(httpMethodOverride, StringComparer.InvariantCultureIgnoreCase)) 
     { 
      filterContext.Result = new HttpStatusCodeResult(405); 
     } 
    } 
} 

y utilizarlo como

[AllowMethods("GET")] 
public ActionResult Index() 
{ 
    ViewBag.Message = "Welcome to ASP.NET MVC!"; 

    return View(); 
} 

El atributo de personalización para tomar HttpVerbs como parámetro depende de usted.