ASP.NET MVC:Controller.HandleUnknownAction 404或405?

Joh*_*ika 5 api rest asp.net-mvc http-status-code-404 http-status-code-405

我重写了ASP.NET MVC的Controller.HandleUnknownAction(string actionName)方法.在未找到操作时以及在不允许HTTP方法时调用它.我该如何区分这两者?我想在找不到动作时返回404,在允许注意方法时返回405.

arc*_*hil 4

我能想到的最简单的方法是创建自定义操作过滤器。如果方法不允许,这将允许您返回 http 状态代码结果

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是,创建更通用的版本,就像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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它

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

    return View();
}
Run Code Online (Sandbox Code Playgroud)

自定义属性以将HttpVerbs作为参数由您决定。