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?
5
A
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.