ASP.NET Core端點路由中三種讓人困惑的路由函式

有態度的馬甲發表於2021-08-26

早先提及了端點路由app.UseEndpoints, 端點路由強調的是端點路由,其核心目的是將 請求落地點與路由定址方式解耦。

這裡面有幾個容易混淆的函式

  • MapControllerRoute
  • MapDefaultControllerRoute
  • MapControllers

有什麼不同?什麼時候該用哪一個?


MapControllerRoute

Adds endpoints for controller actions to the Microsoft.AspNetCore.Routing.IEndpointRouteBuilder
and specifies a route with the given name, pattern, defaults, constraints, and dataTokens.

url約定路由(conventional routing), 通常用在MVC專案中;

需要傳參name pattern defaults constraints dataTokens;

你可以在專案中這樣寫:

endpoints.MapControllerRoute(
  name:"default",
  pattern:"{controller=Home}/{action=index}/{id?}"
);

如果請求url滿足 {host}{controller_name}{action_name}{option_id},將命中Controller=controller_name Action=action_name的方法體;
如果你不提供controller、action名稱,預設是home/index.

說到底這種寫法:
是MVC web專案的早期寫法,讓使用者請求的url去匹配開發者的Controller-Action名稱。

如今約定路由並不是主流,因為所謂的約定路由對於使用者瀏覽並不友好,而且暴露了後端開發者定義的瑣碎的Controller、Action名稱。

實際上,不應該讓使用者的url去匹配開發者定義的Controller-Action名稱(太醜陋的行為),而應該讓開發者去匹配使用者想要使用的url, 這樣特性路由出現了

MapDefaultControllerRoute

Adds endpoints for controller actions to the Microsoft.AspNetCore.Routing.IEndpointRouteBuilder and adds the default route {controller=Home}/{action=Index}/{id?}.

endpoints.MapDefaultControllerRoute(); 正是上面約定路由的預設樣例,這沒什麼好聊的。

MapControllers

Adds endpoints for controller actions to the Microsoft.AspNetCore.Routing.IEndpointRouteBuilder without specifying any routes.

不對約定路由做任何假設,也就是不使用約定路由,依賴使用者的特性路由, 一般用在WebAPI專案中。


全文梳理就會發現: 官方英文描述屢次出現的route,其實特指的是約定路由。

這樣的描述我其實是不苟同的:

路由在.NET裡面, 已經被普世認定為“約定路由”和“特性路由”,基於這種認知,我讀了好幾遍官方英文描述,其實沒讀出個所以然的。

官方英文描述使用 “route”來特指“約定路由”會誤導開發者。

https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs

相關文章