この記事では主に、すべての HTTP リクエストを POST に制限するための MVC 5 の方法を詳しく紹介します。興味のある友人は参考にしてください。今日、同僚がそのような質問をしました。彼はすべての HTTP リクエストを制限したいと考えています。 MVC が受信した POST モードへの要求。
次に、以下の内容で、私が考えた方法を共有します。他の方法がある場合は、メッセージを残してください。
1. HttpPostAttribute 機能誰もが最初に考えるのは、MVC が POST モードで送信される HTTP リクエストを制限するために使用される HttpPostAttribute 機能を提供しているということです。
public class HomeController : Controller { [HttpPost] public ActionResult Index() { return View(); } }
// // 摘要: // 表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class HttpPostAttribute : ActionMethodSelectorAttribute { }
Asp.Net パイプラインでは、HttpModule を使用して HttpApplication オブジェクト内のイベント用の独自のイベント ハンドラーを登録し、すべての HTTP 要求を制御できます。
public class HttpMethodModule : IHttpModule { public void Init(HttpApplication context) { context.PostMapRequestHandler += Context_PostMapRequestHandler; } private void Context_PostMapRequestHandler(object sender, EventArgs e) { HttpApplication httpApplication = (HttpApplication) sender; HttpContext httpContext = httpApplication.Context; //判断当前是否使用的是 MVC 框架来处理请求,其它的请示不做控制。 MvcHandler mvcHandler = httpContext.Handler as MvcHandler; if (mvcHandler != null && httpContext.IsPostMethod() == false) { throw new HttpException(404, "访问的资源不存在。"); } } public void Dispose() { } }
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <modules> <add name="HttpMethod" type="HttpPostWebApp.Web.HttpMethodModule, HttpPostWebApp"/> </modules> </system.webServer> </configuration>
MVC では、グローバル フィルターを通じてリクエストを制御できます。
public class HttpPostFilter : IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext.IsPostMethod() == false) { //如果不是POST请求,则返回404。 filterContext.Result = new HttpNotFoundResult(); } } }
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HttpPostFilter()); } }
ルートを登録する際に、配線制約を定義できます。以下のようにリクエストメソッドをPOSTリクエストに限定することができます。
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } //限制请求方式必须是POST , constraints:new { httpMethod = new HttpMethodConstraint("POST")} ); } }
MVC では、デフォルトですべてのコントローラーがコントローラーを継承します。
BaseController の抽象クラスを定義し、OnActionExecuting をオーバーライドし、他のコントローラーは BaseController から継承できます。
public abstract class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.IsPostMethod() == false) { //如果不是POST请求,则返回404。 filterContext.Result = new HttpNotFoundResult(); } else { base.OnActionExecuting(filterContext); } } }
もちろん、独自のコントローラー基本クラスをすでに定義している場合、このメソッドのワークロードも非常に小さくなります。
まとめ
上記 5 つの方法のうち、方法 2、3、4 は非常に簡単ですが、要件が変更された場合のメンテナンスの負荷が最小限に抑えられるため、私は方法 4 を好みます。
他の方法がある場合は、メッセージを残してください、ありがとう!
以上がMVC5 はすべての HTTP リクエストを POST に制限しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。