Skip to content

MS_ASPNETRouteConfig

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

ASP.NET の RouteConfig

概要

  • RouteConfig では、URL ルーティングの設定を行う。

  • URL ルーティングとは、Request 時の URI に応じて
    処理の受け渡し先(Controller)を決定すること、または、その仕組のことである。

  • URL ルーティングは、もともと、ASP.NET MVC でサポートされていた機能で、
    後に、ASP.NET Web Forms でもファイルの拡張子(*.aspx など)を
    URL に付与しなくても済む「ASP.NET Friendly URLs」が導入された。

補足(ルーティングが導入された意味): 「拡張子を URL から消す」
という表面的な話に見えるが、設計上の転換点である。

【ASP.NET Web Forms(従来)】
   URL =【ファイルのパス】
     /Products/Detail.aspx?id=5
       → ディスク上の Detail.aspx が実行される
     = URL と物理ファイルが 1 対 1

【ASP.NET MVC(ルーティング)】
   URL =【論理的な名前】
     /Products/Detail/5
       → RouteTable が ProductsController.Detail(5) へ振り分ける
     = URL と物理ファイルが【切り離された】

切り離した結果、得られたもの:

効果 内容
URL を設計できる 実装の都合ではなく、利用者・SEO の都合で決められる
実装を変えても URL が変わらない ファイル構成の変更が URL に波及しない
REST 的な設計ができる /api/products/5 のようなリソース指向の URL
技術が漏れない .aspx / .php といった実装技術が URL から見えない

現在は、ASP.NET Core
ミドルウェアとしてルーティングを提供しており、
MVC 以外(Minimal API、Razor Pages、SignalR、gRPC、静的ファイル)も
同じルーティング基盤の上に載る——という形に統一されている。

詳細

MapRoute

URL ルーティングは、以下のように、
RouteCollection.MapRoute メソッドによって定義する。

  1. 引数: name:ルート名。
  2. 引数: url:URI パターン。
  3. 引数: defaults:初期値。
public static void RegisterRoutes(RouteCollection routes) {
  ・・・
  // Defaultルートを定義
  routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = 
      UrlParameter.Optional }
  );
}

補足(規約ベース ルーティングの読み方): このコードが
ASP.NET MVC の既定のルートで、意味を分解しておく。

"{controller}/{action}/{id}"
      ↓          ↓        ↓
  Controller  メソッド  引数

/Products/Detail/5
  → ProductsController の Detail(5) を呼ぶ

/Products        (action, id が省略)
  → defaults により action = "Index"、id = 省略可
  → ProductsController.Index()

/               (すべて省略)
  → HomeController.Index()

UrlParameter.Optional の意味:
「値がなければ、そのパラメータ自体を渡さない」
id = "" を渡すのとは違い、メソッドの既定値が効く

登録順が重要である。

// 上から順に評価され、【最初に一致したルートが使われる】
routes.MapRoute("Blog", "blog/{year}/{month}",
    new { controller = "Blog", action = "Archive" });
routes.MapRoute("Default", "{controller}/{action}/{id}", ...);
//  ↑ Default を先に書くと、blog/... が
//    BlogController.2024Action... と解釈されて壊れる

具体的なルートを先、汎用的なルートを後——これが原則である。

IgnoreRoute も併用する

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// ↑ WebResource.axd 等をルーティングの対象外にする

Route属性

  • Route 属性で設定する方法。
  • 詳しくはコチラを参照。

補足(属性ルーティングが現在の主流): ASP.NET MVC 5 /
Web API 2 で導入された属性ルーティングは、
現在ではこちらが標準である。

[RoutePrefix("api/products")]
public class ProductsController : Controller
{
    [Route("{id:int}")]                    // GET api/products/5
    public ActionResult Detail(int id) { ... }

    [Route("{id:int}/reviews")]            // GET api/products/5/reviews
    public ActionResult Reviews(int id) { ... }
}

規約ベースと比べた利点:

規約ベース(MapRoute 属性ルーティング
URL の所在 RouteConfig.cs離れた場所 メソッドの直上(見える)
複雑な URL ルート定義が増えて読めなくなる メソッドごとに自然に書ける
制約 定義が煩雑 {id:int} のように簡潔
全体像の把握 一箇所で見渡せる 散らばる

現在の使い分け:

・API(リソース指向)        → 【属性ルーティング】
・画面(MVC の伝統的な構成)  → 規約ベースでも良い
・両方を混在させることも可能(属性が優先される)

ルート制約は覚えておくと有用である。

{id:int}         整数
{id:guid}        GUID
{name:minlength(3)}  3 文字以上
{year:range(2000,2099)}  範囲
{*path}          【残り全部】(キャッチオール)

詳しくはコチラを参照。

補足(ASP.NET Core でのルーティング): 仕組みが根本的に変わった
ため、要点を補っておく。

【ASP.NET Core:ルーティングはミドルウェアである】

   app.UseRouting();       ← ① URL からエンドポイントを決める
   app.UseAuthentication();
   app.UseAuthorization(); ← ② 決まったエンドポイントの属性を見て認可
   app.MapControllers();   ← ③ エンドポイントを実行

   → ① と ③ の【間】に認可が入れる点が重要
     (どのアクションが呼ばれるか分かった状態で認可できる)
// 規約ベース
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
    //                                          ↑ ? が省略可の意味

// 属性ルーティング(Core では [Route] が標準)
[ApiController]
[Route("api/[controller]")]        // [controller] はトークン置換
public class ProductsController : ControllerBase
{
    [HttpGet("{id:int}")]
    public IActionResult Get(int id) => Ok();
}

// Minimal API(.NET 6 以降)
app.MapGet("/api/products/{id:int}", (int id) => Results.Ok());

UrlParameter.Optional{id?} に記法が変わった点に注意する。

ルーティングが統一されたことで、
MVC 以外もすべて同じ仕組みに載る

app.MapRazorPages();
app.MapHub<ChatHub>("/chat");      // SignalR
app.MapGrpcService<GreeterService>();
app.MapHealthChecks("/health");
app.MapFallbackToFile("index.html");  // SPA 向け

ASP.NET Web Forms の URL ルーティング(「ASP.NET Friendly URLs」)
については、ASP.NET Web Forms の Modernization を参照のこと。

参考

Microsoft Learn


Tags: 移行, .NET開発, ASP.NET, ASP.NET Web Forms, ASP.NET MVC

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally