ASP.NETCoreで属性ルーティングを使用する方法

ASP.NET Coreのルーティングミドルウェアは、着信要求をそれぞれのルートハンドラーにマッピングすることに長けています。ASP.NET Coreでルーティングを設定するには、属性ベースのルーティングと規則ベースのルーティングの2つの方法があります。

ルーティング情報が単一の場所で指定されるコンベンションベースのルーティングとは異なり、属性ルーティングでは、アクションメソッドを属性で装飾することによってルーティングを実装できます。この記事では、ASP.NET CoreMVCで属性ベースのルーティングを使用する方法について説明します。

この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。 

Visual Studio2019でASP.NETCore 3.1MVCプロジェクトを作成します

まず、Visual Studio2019でASP.NETCoreプロジェクトを作成しましょう。VisualStudio2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しいASP.NETCoreプロジェクトを作成します。

  1. Visual StudioIDEを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. [新しいプロジェクトの作成]ウィンドウで、表示されたテンプレートのリストから[ASP.NET CoreWebアプリケーション]を選択します。
  4. [次へ]をクリックします。
  5. 「新しいプロジェクトの構成」ウィンドウで、新しいプロジェクトの名前と場所を指定します。
  6. 必要に応じて、[ソリューションとプロジェクトを同じディレクトリに配置する]チェックボックスをオンにします。
  7. [作成]をクリックします。
  8. 次に示す[新しいASP.NETCore Webアプリケーションの作成]ウィンドウで、ランタイムとして.NET Coreを選択し、上部のドロップダウンリストからASP.NET Core 3.1(またはそれ以降)を選択します。
  9. プロジェクトテンプレートとして「Webアプリケーション(Model-View-Controller)」を選択して、新しいASP.NET CoreMVCアプリケーションを作成します。 
  10. ここではこれらの機能を使用しないため、[Dockerサポートを有効にする]チェックボックスと[HTTPS用に構成する]チェックボックスがオフになっていることを確認してください。
  11. 認証も使用しないため、[認証]が[認証なし]に設定されていることを確認してください。
  12. [作成]をクリックします。

これらの手順に従うと、Visual Studio2019で新しいASP.NETCore MVCプロジェクトが作成されます。以下のセクションでこのプロジェクトを使用して、ASP.NET Core3.1で属性ルーティングを操作する方法を説明します。

ASP.NET CoreMVCでコントローラークラスを作成します

DefaultControllerという名前の新しいコントローラーを作成し、DefaultControllerのデフォルトのソースコードを次のコードに置き換えます。

    パブリッククラスDefaultController:コントローラー

    {{

        [ルート("")]

        [Route( "Default")]

        [Route( "Default / Index")]

        public ActionResult Index()

        {{

            新しいEmptyResult();を返します。

        }

        [Route( "Default / GetRecordsById / {id}")]

        public ActionResult GetRecordsById(int id)

        {{

            string str = string.Format

            ( "パラメータとして渡されるIDは次のとおりです:{0}"、id);

            Ok(str);を返します。

        }

    }

ASP.NETCoreのコントローラーレベルで属性ルーティングを使用する

属性ルーティングは、コントローラーレベルとアクションメソッドレベルの両方で使用できます。コントローラレベルでroute属性を適用すると、ルートはそのコントローラのすべてのアクションメソッドに適用できます。

DefaultControllerクラスを調べると、アクションメソッドのルートテンプレートを指定するときに、デフォルトルートが複数回使用されていることがわかります。次のコードスニペットは、コントローラレベルでさまざまなルート属性を指定して、属性ルーティングをより柔軟に使用する方法を示しています。

[Route( "Default")]   

パブリッククラスDefaultController:コントローラー

{{

  [ルート("")]

  [Route( "Index")]

  public ActionResult Index()

  {{

      新しいEmptyResult();を返します。

   }

  [HttpGet]

  Route( "Default / GetRecordsById / {id}")]

  public ActionResult GetRecordsById(int id)

  {{

      string str = string.Format( "パラメータとして渡されるIDは次のとおりです:{0}"、id);

      Ok(str);を返します。

   }

}

コントローラレベルとアクションメソッドレベルの両方でルート属性を使用する場合、コントローラレベルで適用されるルートテンプレートは、アクションメソッドレベルで指定されたルートテンプレートの前に付加されます。

多くの場合、コントローラーに共通のプレフィックスが必要になる場合があります。その場合、以下のコードスニペットに示すように[RoutePrefix]属性を使用する必要があります。

[RoutePrefix( "services")]

パブリッククラスHomeController:コントローラー

{{

   //アクションメソッド

}

ASP.NETCoreのアクションメソッドレベルで属性ルーティングを使用する

上記のDefaultControllerクラスを参照してください。ご覧のとおり、DefaultControllerクラスのIndexメソッドで3つのルートを指定しました。これは、次の各URLがDefaultControllerのIndex()アクションメソッドを呼び出すことを意味します。

// localhost:11277

// localhost:11277 / home

// localhost:11277 / home / index

規則ベースのルーティングと同様に、属性ベースのルーティングでもパラメータを指定できます。つまり、属性ベースのルーティングでは、パラメータを使用してルート属性を指定できます。前に示したDefaultControllerクラスのGetRecordsByIdアクションメソッドは一例です。

指定されたルートの「{id}」は、パラメータまたはプレースホルダーを表すことに注意してください。この例のidパラメーターは、文字列や整数など、何でもかまいません。パラメータを整数のみに制限したい場合はどうなりますか?これは、制約を使用して実現できます。

アクションメソッドで属性ルート制約を使用する

ルート制約は、コントローラーアクションへの無効な要求を阻止するために使用されます。たとえば、アクションメソッドに渡されるパラメーターが常に整数であることを確認したい場合があります。ルート制約を使用する構文は{parameter:constraint}です。次のコードスニペットはこれを示しています。ここでのidパラメータは常に整数であることに注意してください。

[Route( "Default / GetRecordsById / {id:int}")]

public ActionResult GetRecordsById(int id)

{{

  string str = string.Format( "パラメータとして渡されるIDは次のとおりです:{0}"、id);

  Ok(str);を返します。

}

属性ルート仕様でオプションのパラメータを使用する

ルート仕様でオプションのパラメータを使用することもできます。次のコードスニペットは、これを実現する方法を示しています。この場合のactionメソッドは、idパラメーターが渡されなくても実行されることに注意してください。

[Route( "Sales / GetSalesByRegionId / {id?}")]

属性ルーティングを使用する場合、コントローラー名もアクションメソッド名も、実行するアクションメソッドの選択に影響を与えないことを理解することが重要です。これを例で見てみましょう。次のコードスニペットは、GetRecordsByIdアクションメソッドのルート仕様でURLがどのように変更されたかを示しています。

[Route( "Home / GetRecordsById / {id:int}")]

public ActionResult GetRecordsById(int id)

{{

   string str = string.Format( "パラメータとして渡されるIDは次のとおりです:{0}"、id);

   Ok(str);を返します。

}

これで、次のURLを使用してGetRecordsByIdアクションメソッドを呼び出すことができます。

// localhost:11277 / home / GetRecordsById / 1

アクションメソッドで複数の属性ルート制約を使用する

パラメータに複数の制約を適用することもできます。次のコードスニペットは、これを実現する方法を示しています。idパラメータの最小値は1である必要があることに注意してください。そうでない場合、404エラーが返されます。

[Route( "Default / GetRecordsById / {id:int:min(1)}")]

public ActionResult GetRecordsById(int id)

{{

    string str = string.Format( "パラメータとして渡されるIDは次のとおりです:{0}"、id);

    Ok(str);を返します。

}

アクションメソッドの属性ルートでHTTP動詞を使用する

属性ルーティングでHTTP動詞を使用することもできます。次のコードスニペットは、これを実現する方法を示しています。

[HttpGet]

[Route( "Default / GetRecordsById / {id:int:min(1)}")]

public ActionResult GetRecordsById(int id)

{{

  string str = string.Format( "パラメータとして渡されるIDは次のとおりです:{0}"、id);

  Ok(str);を返します。

}

一般的に使用される属性ルート制約 

これは、ASP.NETCoreで最も一般的に使用されるルート制約のリストです。 

  • bool-ブール値を照合するために使用されます
  • datetime-DateTime値を照合するために使用されます
  • 10進数-小数値との照合に使用されます
  • double-64ビット浮動小数点値を照合するために使用されます
  • float-32ビット浮動小数点値を照合するために使用されます
  • guid-GUID値を照合するために使用されます
  • int-32ビット整数値を照合するために使用されます
  • long-64ビット整数値に一致するために使用されます
  • max-整数を最大値と照合するために使用されます
  • min-整数を最小値と照合するために使用されます
  • minlength-最小の長さの文字列を照合するために使用されます
  • regex-正規表現に一致するために使用されます

カスタム属性ルート制約を作成する 

以下に示すコードスニペットに示すように、IRouteConstraintインターフェイスを拡張し、Matchメソッドを実装するクラスを作成することにより、独自のカスタムルート制約を作成することもできます。

パブリッククラスCustomRouteConstraint:IRouteConstraint

    {{

        public bool Match(HttpContext httpContext、IRouter route、

        文字列routeKey、

        RouteValueDictionary値、RouteDirection routeDirection)

        {{

            新しいNotImplementedException();をスローします。

        }

    }

コントローラレベルの属性ルートでトークン置換を使用する

ASP.NET Core MVCの属性ルーティングは、トークン置換という別の興味深い機能のサポートを提供します。コントローラでトークン[action]、[area]、および[controller]を使用できます。これらのトークンは、それぞれaction、area、およびcontroller名に置き換えられます。次のコードスニペットは、これを実現する方法を示しています。

[Route( "[controller] / [action]")]

パブリッククラスHomeController:コントローラー

{{

   プライベート読み取り専用ILogger_logger;

   public HomeController(ILogger logger)

   {{

       _logger =ロガー;

   }

   public IActionResult Index()

   {{

       View();を返す

   }

   //その他のアクションメソッド

}

ASP.NET Coreの属性ルーティングにより、WebアプリケーションのURIをより細かく制御できます。規則ベースのルーティングは単一の場所で構成でき、アプリケーション内のすべてのコントローラーに適用できますが、規則ベースのルーティングで特定のURIパターン(APIバージョン管理など)をサポートすることは困難です。

属性ルーティングを使用することにより、コントローラー名とアクション名をルートテンプレートから切り離すことができます。ASP.NET Coreアプリケーションでは、規則ベースのルーティングと属性ベースのルーティングを組み合わせて使用​​することもできます。

ASP.NET Coreでさらに多くのことを行う方法:

  • ASP.NET CoreMVCのアクションメソッドにパラメーターを渡す方法
  • ASP.NETCoreでAPIアナライザーを使用する方法
  • ASP.NETCoreでルートデータトークンを使用する方法
  • ASP.NETCoreでAPIバージョン管理を使用する方法
  • ASP.NET Core3.1でデータ転送オブジェクトを使用する方法
  • ASP.NET CoreMVCで404エラーを処理する方法
  • ASP.NET Core3.1のアクションフィルターで依存性注入を使用する方法
  • ASP.NETCoreでオプションパターンを使用する方法
  • ASP.NET Core 3.0MVCでエンドポイントルーティングを使用する方法
  • ASP.NET Core3.0でExcelにデータをエクスポートする方法
  • ASP.NET Core3.0でLoggerMessageを使用する方法
  • ASP.NETCoreで電子メールを送信する方法
  • ASP.NETCoreでSQLServerにデータを記録する方法
  • ASP.NETCoreでQuartz.NETを使用してジョブをスケジュールする方法
  • ASP.NET Core WebAPIからデータを返す方法
  • ASP.NETCoreで応答データをフォーマットする方法
  • RestSharpを使用してASP.NETCore WebAPIを使用する方法
  • Dapperを使用して非同期操作を実行する方法
  • ASP.NETCoreで機能フラグを使用する方法
  • ASP.NETCoreでFromServices属性を使用する方法
  • ASP.NETCoreでCookieを操作する方法
  • ASP.NETCoreで静的ファイルを操作する方法
  • ASP.NETCoreでURL書き換えミドルウェアを使用する方法
  • ASP.NETCoreでレート制限を実装する方法
  • ASP.NETCoreでAzureApplicationInsightsを使用する方法
  • ASP.NETCoreで高度なNLog機能を使用する
  • ASP.NET WebAPIでエラーを処理する方法
  • ASP.NET CoreMVCでグローバル例外処理を実装する方法
  • ASP.NET CoreMVCでnull値を処理する方法
  • ASP.NET Core WebAPIの高度なバージョン管理
  • ASP.NETCoreでワーカーサービスを操作する方法
  • ASP.NETCoreでDataProtectionAPIを使用する方法
  • ASP.NETCoreで条件付きミドルウェアを使用する方法
  • ASP.NETCoreでセッション状態を操作する方法
  • ASP.NETCoreで効率的なコントローラーを作成する方法