ASP.NET MVC:Controller.HandleUnknownAction 404 还是 405?

Posted

技术标签:

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

我正在重写 ASP.NET MVC 的 Controller.HandleUnknownAction(string actionName) 方法。当未找到操作以及不允许使用 HTTP 方法时,将调用它。我怎样才能区分这两者?我想在未找到和操作时返回 404,当方法被允许时返回 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 作为参数的自定义属性由您决定。

【讨论】:

以上是关于ASP.NET MVC:Controller.HandleUnknownAction 404 还是 405?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net mvc和asp.net有啥区别?

七天学会ASP.NET MVC ——ASP.NET MVC 数据传递

ASP.NET MVC

ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?

ASP.NET MVC 和 Angularjs 与 ASP.NET MVC 和 Reactjs

七天学会ASP.NET MVC ——ASP.Net MVC 数据处理