5

Ich überschreibe ASP.NET MVC Controller.HandleUnknownAction (String ActionName) -Methode. Es wird aufgerufen, wenn eine Aktion nicht gefunden wird und auch wenn eine HTTP-Methode nicht erlaubt ist. Wie kann ich zwischen den beiden unterscheiden? Ich möchte eine 404 zurückgeben, wenn und keine Aktion gefunden wird und 405, wenn eine Methode nicht erlaubt ist.ASP.NET MVC: Controller.HandleUnknownAction 404 oder 405?

Antwort

3

Die einfachste Möglichkeit, die ich mir vorstellen kann, ist die Erstellung eines benutzerdefinierten Aktionsfilters. Dies ermöglicht Ihnen, HTTP-Statuscode Ergebnis zurück, wenn Methode nicht

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

Oder besser, generische Version davon zu erstellen, ähnlich wie 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); 
     } 
    } 
} 

Und verwenden Sie es wie

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

    return View(); 
} 

Anpassen Attribut zu übernehmen HttpVerbs als Parameter ist Ihnen überlassen.