.NET TIPS

[ASP.NET MVC]特定のHTTPメソッドにマッチするルートを定義するには?[3.5、4以降、C#、VB]

山田 祥寛
2010/08/05

 「TIPS:[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?」では、ルート・パラメータの値に対して制約条件を課す方法について解説した。ルート・パラメータに対して制約条件を追加することで、より精度の高いルートを定義できるようになる。

 もっとも、制約条件を課すことができるのは、何も個々のパラメータに対してだけではない。ルートそのものに対して制約条件を課すことも可能だ。

 例えば、以下は先述のTIPSで定義したArticleルートに対して、HTTP GETメソッドで要求があった場合にのみマッチするよう制約条件を追加する例である(追記部分は太字で表している)。

routes.MapRoute(
  "Article", // ルート名
  "Article/{day}/{month}/{year}",          // URIパターン
  new {
    controller = "Route",                  // コントローラ名
    action = "Index",                      // アクション名
    day = DateTime.Now.Day,                // 日
    month = DateTime.Now.Month,            // 月
    year = DateTime.Now.Year               // 年
  },
  new{
    day = @"\d{1,2}",                      // 日は1〜2けた
    month = @"\d{1,2}",                    // 月は1〜2けた
    year = @"\d{4}",                       // 年は4けた
    http = new HttpMethodConstraint("GET")  // HTTP GETのみ受け付け
  }
);
routes.MapRoute( _
  "Article", _ ' ルート名
  "Article/{day}/{month}/{year}", _        ' URIパターン
  New With { _
    .controller = "Route", _               ' コントローラ名
    .action = "Index", _                   ' アクション名
    .day = DateTime.Now.Day, _             ' 日
    .month = DateTime.Now.Month, _         ' 月
    .year = DateTime.Now.Year _            ' 年
  }, _
  New With { _
    .day = "\d{1,2}", _                    ' 日は1〜2けた
    .month = "\d{1,2}", _                  ' 月は1〜2けた
    .year = "\d{4}", _                     ' 年は4けた
    .http = New HttpMethodConstraint("GET") _  ' HTTP GETのみ受け付け
  } _
)
HTTP GETメソッドによる要求にのみマッチするArticleルートを定義するコード(上:Global.asax.cs、下:Global.asax.vb)

 ルートそのものに対する制約条件も、MapRouteメソッドの第3引数に匿名型として定義できる。ただし、その形式は(「パラメータ名 = 正規表現パターン」ではなく)、

キー名 = IRouteConstraint実装クラスのインスタンス

である必要がある。キー名は、ほかのパラメータ名と重複しない限り、任意の文字列を指定すればよい。

 IRouteConstraintインターフェイス(System.Web.Routing名前空間)は、リクエスト情報が制約に対して妥当であるかを判定するための機能を定義したインターフェイスである。ここでは、IRouteConstraint実装クラスとして、HTTPメソッドをキーにリクエストを制約するためのHttpMethodConstraintクラス(System.Web.Routing名前空間)を指定している。

 HttpMethodConstraintクラスのコンストラクタの構文は、以下のとおりだ。

public HttpMethodConstraint(params string[] allowedMethods)
HttpMethodConstraintクラスの構文(C#)
allowedMethods:有効なHTTPメソッド。

 上の例では、引数allowedMethodsに「"GET"」を指定しているので、ArticleルートはHTTP GETメソッドに対してのみ適用されることになる。

 セレクタ属性であるHttpVerbs属性にも似ているが、HttpVerbs属性がアクション・メソッド単位でのマッチングを制約するのに対して、HttpMethodConstraintクラスはルート全体を制約する点が異なる。当該のルートで最初から特定のHTTPメソッドしか使われないことが分かっているならば、HttpMethodConstraintクラスで制約を課した方がシンプルだろう。

 なお、ここではHTTP GETでのアクセスのみを許可しているが、もしもGET、POSTによるリクエストを許可したいならば、以下のように必要なHTTPメソッドを列挙すればよい(C#の場合)。

http = new HttpMethodConstraint("GET", "POST")
複数のHTTPメソッドを指定する例

 .NET Framework 4の時点で、標準で提供されているIRouteConstraint実装クラスは、HttpMethodConstraintクラスだけである。そのほか、ルートそのものに関する制約を設定したい場合には、自分でIRouteConstraint実装クラスを定義する必要がある。自作の制約条件を定義する方法については、後日「TIPS:[ASP.NET MVC]有効期限のあるルーティング規則を定義するには?」で解説する予定である。End of Article

利用可能バージョン:.NET Framework 3.5
利用可能バージョン:.NET Framework 4
カテゴリ:ASP.NET MVC 処理対象:ルーティング
関連TIPS:[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?
使用ライブラリ:IRouteConstraintインターフェイス(System.Web.Routing名前空間)
使用ライブラリ:HttpMethodConstraintクラス(System.Web.Routing名前空間)

この記事と関連性の高い別の.NET TIPS
[ASP.NET MVC]有効期限のあるルーティング規則を定義するには?
[ASP.NET MVC]ルート・パラメータに妥当な日付が渡されているかを判定するには?
[ASP.NET MVC]ルート・パラメータに制約条件を追加するには?
[ASP.NET MVC]特定のルートを無効化するには?
[ASP.NET MVC]ルート定義を追加するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間