5

Sto ignorando il metodo Controller.HandleUnknownAction (stringa actionName) di ASP.NET MVC. Viene chiamato quando non viene trovata un'azione e anche quando non è consentito un metodo HTTP. Come posso distinguere tra i due? Mi piacerebbe restituire un 404 quando e l'azione non viene trovata e 405 quando un metodo è consentito.ASP.NET MVC: Controller.HandleUnknownAction 404 o 405?

risposta

3

Il modo più semplice a cui posso pensare è creare un filtro azione personalizzato. Questo vi permetterà di tornare stato HTTP risultato codice se il metodo non è consentito

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

O meglio, creare la versione più generica di esso, proprio come 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); 
     } 
    } 
} 

e usarlo come

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

    return View(); 
} 

Personalizzare l'attributo per prendere HttpVerbs come parametro.