ホームページ >バックエンド開発 >C#.Net チュートリアル >すべての HTTP リクエストを POST に制限するにはどうすればよいですか?

すべての HTTP リクエストを POST に制限するにはどうすればよいですか?

零下一度
零下一度オリジナル
2017-06-19 10:09:202991ブラウズ

この記事では主に、すべての 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
 {

 }

2. HttpModule の使用


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()
 {

 }
 }

Web.config に関連する構成を追加します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
 <modules>
 <add name="HttpMethod" type="HttpPostWebApp.Web.HttpMethodModule, HttpPostWebApp"/>
 </modules>
 </system.webServer>
</configuration>

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

3. MVC

フィルター
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());
 }
 }

4. ルーティングの制約


ルートを登録するときに、

ルートの制約を定義

することができます。以下のようにリクエストメソッドを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")}
  );
 }
 }

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


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 サイトの他の関連記事を参照してください。

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