-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ASPNETRouteConfig
- 戻る(ASP.NET)
-
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、静的ファイル)も
同じルーティング基盤の上に載る——という形に統一されている。
URL ルーティングは、以下のように、
RouteCollection.MapRoute メソッドによって定義する。
- 引数: name:ルート名。
- 引数: url:URI パターン。
- 引数: 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 属性で設定する方法。
- 詳しくはコチラを参照。
補足(属性ルーティングが現在の主流): 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 を参照のこと。
- [ASP.NET MVC]ルート定義を追加するには?[3.5、4、C#、VB] - @IT
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/1031aspmvcrouting1/aspmvcrouting1.html
- ASP.NET Core のルーティング
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/routing - ASP.NET Core でのコントローラー アクションへのルーティング
https://learn.microsoft.com/ja-jp/aspnet/core/mvc/controllers/routing - ASP.NET MVC のルーティング(.NET Framework)
https://learn.microsoft.com/ja-jp/aspnet/mvc/overview/older-versions-1/controllers-and-routing/asp-net-mvc-routing-overview-cs
Tags: 移行, .NET開発, ASP.NET, ASP.NET Web Forms, ASP.NET MVC
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。