ホームページ  >  記事  >  バックエンド開発  >  MVC 5 はすべての HTTP リクエストを POST に制限します

MVC 5 はすべての HTTP リクエストを POST に制限します

巴扎黑
巴扎黑オリジナル
2017-06-26 15:20:012018ブラウズ

今日、同僚が MVC によって受信されるすべての HTTP リクエストを POST に制限したいと質問しました。

次に、以下の内容で私が考えた方法をシェアさせていただきますので、もし他の方法があればメッセージを残してください。

1. HttpPostAttribute 機能

誰もが最初に考えるのは、MVC が POST モードで送信される HTTP リクエストを制限するために使用される HttpPostAttribute 機能を提供しているということです。

1   public class HomeController : Controller2   {        
3         [HttpPost]4         public ActionResult Index()5         {6             return View();7         }8   }

この機能はアクションメソッドにのみマークできます。各アクションメソッドをマークしてコーダーを作成する必要があります。このメソッドは絶対に受け入れられません。

1     //2     // 摘要:3     //     表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。4     [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]5     public sealed class HttpPostAttribute : ActionMethodSelectorAttribute6     {7 8     }
コードの表示

2. HttpModule の使用

Asp.Net パイプラインでは、HttpModule を使用して、HttpApplication オブジェクト内のイベントに対する独自のイベント ハンドラーを登録し、すべての HTTP 要求を制御できます。

 1     public class HttpMethodModule : IHttpModule 2     { 3         public void Init(HttpApplication context) 4         { 5             context.PostMapRequestHandler += Context_PostMapRequestHandler; 6         } 7  8         private void Context_PostMapRequestHandler(object sender, EventArgs e) 9         {10             HttpApplication httpApplication = (HttpApplication) sender;11             HttpContext httpContext = httpApplication.Context;12 13 14             //判断当前是否使用的是 MVC 框架来处理请求,其它的请示不做控制。15             MvcHandler mvcHandler = httpContext.Handler as MvcHandler;16 17             if (mvcHandler != null && httpContext.IsPostMethod() == false) {18                 throw new HttpException(404, "访问的资源不存在。");19             }20         }21 22         public void Dispose()23         {24 25         }26     }

Web.config に関連する設定を追加します。

1 <?xml version="1.0" encoding="utf-8"?>2 <configuration>3   <system.webServer>4     <modules>5       <add name="HttpMethod" type="HttpPostWebApp.Web.HttpMethodModule, HttpPostWebApp"/>6     </modules>7   </system.webServer>8 </configuration>

テスト後、当社の要件を満たすことができます(テスト結果は実証されません)。

3. MVC フィルター

MVC では、グローバル フィルターを通じてリクエストを制御できます。

 1     public class HttpPostFilter : IAuthorizationFilter 2     { 3         public void OnAuthorization(AuthorizationContext filterContext) 4         { 5             if (filterContext.HttpContext.IsPostMethod() == false) { 6  7                 //如果不是POST请求,则返回404。 8                 filterContext.Result = new HttpNotFoundResult(); 9             }10         }11     }

プログラムが起動したら、グローバルフィルターとして登録します。

1     public class FilterConfig2     {3         public static void RegisterGlobalFilters(GlobalFilterCollection filters)4         {5             filters.Add(new HttpPostFilter());6         }7     }

4. ルーティング制約

ルートを登録するときに、ルーティング制約を定義できます。以下のようにリクエストメソッドをPOSTリクエストに限定することができます。

 1     public class RouteConfig 2     { 3         public static void RegisterRoutes(RouteCollection routes) 4         { 5             routes.MapRoute( 6                 name: "Default", 7                 url: "{controller}/{action}/{id}", 8                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 9                 //限制请求方式必须是POST10               , constraints:new { httpMethod =  new HttpMethodConstraint("POST")}11             );12         }13     }

5. コントローラーのメソッドをオーバーライドする

MVC では、デフォルトですべてのコントローラーがコントローラーを継承します。

BaseController の抽象クラスを定義し、OnActionExecuting をオーバーライドし、他のコントローラーは BaseController を継承できます。

 1     public abstract class BaseController : Controller 2     { 3         protected override void OnActionExecuting(ActionExecutingContext filterContext) 4         { 5              6             if (filterContext.HttpContext.IsPostMethod() == false) { 7                 //如果不是POST请求,则返回404。 8                 filterContext.Result = new HttpNotFoundResult(); 9             }10             else {11                 base.OnActionExecuting(filterContext);12             }13         }14     }

この方法は、すべてのコントローラーの基本クラスを変更する必要があるため、お勧めできません。

もちろん、独自のコントローラー基本クラスをすでに定義している場合、このメソッドの作業負荷も非常に小さくなります。

まとめ

上記 5 つの方法のうち、方法 2、3、4 は非常に簡単ですが、要件が変更された場合のメンテナンスの負荷が最小限に抑えられるため、私は方法 4 を好みます。

他の方法がある場合は、メッセージを残してください、ありがとう!

以上がMVC 5 はすべての HTTP リクエストを POST に制限しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。