5

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

答えて

3

私が考えることができる最も簡単な方法は、カスタムアクションフィルタを作成することです。これは、メソッドが

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(); 
} 
のようにそれを使用するように、それのより一般的なバージョンを作成し、HTTPステータスコードの結果を返すことができます

パラメータとしてHttpVerbsを使用するように属性をカスタマイズするのはあなた次第です。

関連する問題