この記事では主に、すべての 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 を推奨します。
他の方法がある場合は、メッセージを残してください、ありがとう!
デモのダウンロード: mvchttppostwebapp
以上がすべての HTTP リクエストを POST に制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。