5

ASP.NET MVC の Controller.HandleUnknownAction(string actionName) メソッドをオーバーライドしています。アクションが見つからない場合や、HTTP メソッドが許可されていない場合に呼び出されます。どうすれば2つを区別できますか?アクションが見つからない場合は 404 を返し、メソッドが許可されていない場合は 405 を返したいと思います。

4

1 に答える 1

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

または、 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を取るように属性をカスタマイズするのはあなた次第です。

于 2012-04-30T16:38:03.300 に答える