【问题标题】:ASP.NET MVC: Controller.HandleUnknownAction 404 or 405?ASP.NET MVC:Controller.HandleUnknownAction 404 还是 405?
【发布时间】:2012-05-10 07:26:18
【问题描述】:

我正在重写 ASP.NET MVC 的 Controller.HandleUnknownAction(string actionName) 方法。当未找到操作以及不允许使用 HTTP 方法时,将调用它。我怎样才能区分这两者?我想在未找到和操作时返回 404,当方法被允许时返回 405。

【问题讨论】:

    标签: asp.net-mvc api rest http-status-code-404 http-status-code-405


    【解决方案1】:

    我能想到的最简单的方法是创建自定义操作过滤器。如果方法不被允许,这将允许您返回 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);
            }
        }
    }
    

    或者更好,创建更通用的版本,就像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);
            }
        }
    }
    

    并像使用它

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 2020-11-12
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2017-01-24
      • 2015-04-19
      • 2011-02-15
      相关资源
      最近更新 更多