【问题标题】: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 作为参数的自定义属性由您决定。