Net Core 路由設定探討
之前寫.NET Core MVC
裡面探討Services.AddMvc
和Services.AddMvcCore
方法差異。
這邊只有簡單紀錄重點。
addMvcCore: 只包含MVC功能。所以Controller 用到JSON 回傳會錯誤。
addMvc: 包含MVC Core和相關第三方常用服務方法。
最近建立空白專案,發現所有 Startup.cs
都是空的。瞬間不知道要放什麼…
還是了解一下這些事做什麼,主要記錄這篇以後使用知道自己在幹嘛
Service 註冊設定
其實我後來發現 Visual Studio 會建議你設定 Services.AddMvc
。
這個功能是最多的
Routing in ASP.NET Core | Microsoft Docs
設定我發現還滿多的
- services.AddMvcCore()
- services.AddControllers()
- services.AddControllersWithViews()
- services.AddRazorPages()
- services.AddMvc()
這邊小記ASP.NET Core 練習 - 在 Razor Pages 專案加入 MVC-黑暗執行緒內容。
|
|
這邊我懷疑只註冊運行 Controller/Razor Pages 必要的核心服務 寫錯了。
順便問 AI 大神。
最後再做個確認,可以推薦看一下 ASP.NET Core 中 AddMvc() 與 AddMvcCore() 的差別 - Yowko’s Notes這篇,真的去爬程式跑什麼。
現在老了看條列式有點吃力,我依照上面內文簡單用類別圖整理這個。方便以後查詢。
前陣子看微軟範例,我找不到 Controller 對應 View 的方法,後來發現他使用 Razor Pages,cshtml
。因為我最近轉寫.Net Core
不知道有這玩意,他方法大概有 GET,POST 方法,不過我朋友說現在很少在用。
可以看:
- AspNetCore.Docs/Index.cshtml.cs at main · dotnet/AspNetCore.Docs
- AspNetCore.Docs/Startup.cs at main · dotnet/AspNetCore.Docs
我後來仔細看AddRazorPages
和AddControllersWithViews
方法的東西好像都有包含,看不出來兩者差異,我後來有爬到
- [ASP.NET Core] AddController(), AddMvc(), AddControllersWithViews(), AddRazorPages() 차이점 :: 또치의 삽질 보관함
- AddController vs AddMvc vs AddControllersWithViews vs AddRazorPages
AddRazorPages vs AddControllersWithViews
這邊先了解
在看上面問題。
就能看出AddRazorPages
和AddControllersWithViews
差在API Explorer和 CORS和Formatter Mapping 。
這邊有問 AI 大大。
- ASP.NET Core Web API 中的自訂格式器 | Microsoft Docs
- [ASP.NET Core 6] 讓你的 ASP.NET Core Web API + Swashbuckle.AspNetCore 支援多個版本 | 余小章 @ 大內殿堂 - 點部落
API Explorer找出文章跟 swagger 有關係,不知道是不是指找 API URL 給 swagger 用?
ApiExplorer 是什麼?
為瞭解決這個問題,我需要深入研究Swashbuckle的工作原理。事實證明,它在內部使用 ApiExplorer,這是ASP.NET Core附帶的API元數據層。特別是,它使用該ApiDescription.GroupName屬性來確定將哪些方法放入哪些文件中。如果該屬性是null或它和文檔名稱(例如「client-v1」)相等,則Swashbuckle將其包括在內。並且,默認設置是null,這就是兩個Swagger文件都相同的原因。
有兩種方法設置GroupName。我可以通過在控制器的每個方法上設置ApiExplorerSettings屬性來進行設置,但這將是乏味且難以維護的。相反,我選擇了神奇的路由。
參考: 使用Swagger,ApiExplorer和NSwag掌握ASP.NET Core和ABP中的外部Web API_寒冰屋的博客-CSDN博客
路由設定
其實我看官方 Routing in ASP.NET Core | Microsoft Docs 講得滿多東西,但大部分實務上可能只會用幾個方法。
這邊建議看中間件概念,在看這段,不然有些在做什麼會不知道在幹嘛。
UseEndpoints vs UseRouting
ASP.NET Core 3.0 中 app.UseRouting 与 app.UseEndpoints 的区别是什么_已解决_博问_博客园
先記錄我發現的現象,放下 endpoints 時候前面需要放UseRouting
。沒放的話就不能執行,因為會有問題。我看到有篇說 UseRouting
是類似做初始化動作。
我看官網文件也說到順序要這樣用。
原來 Endpoints是重點。
後來我看到這篇Asp.Net Core EndPoint 終結點路由工作原理解讀 - 知乎有提到
- UseRouting() 、UseAuthorization()、UseEndpoints() 這三個中間件的關係是什麼呢?
答:UseRouing 中間件主要是路由匹配,找到匹配的終結者路由Endpoint ;UseEndpoints 中間件主要針對UseRouting 中間件匹配到的路由進行 委託方法的執行等操作。 UseAuthorization 中間件主要針對 UseRouting 中間件中匹配到的路由進行攔截 做授權驗證操作等,通過則執行下一個中間件UseEndpoints()
Endpoints 有哪些可以用?
平常我看到 Endpoints 看不出來在做什麼?稍微看一下文件有寫這些方法可以用。
其實黑暗執行續那篇也有小記
MapDefaultControllerRoute
註冊 //{id?}
MapControllerRoute
使用 Pattern、Constraint 自訂路由
MapControllers
在 Controller Action 透過 [Rount(“Home/About”)] 等 Attribute 指定路由。
MapAreaControllerRoute
支援 Area 路由
MapDynamicControllerRoute
使用自訂類別動態決定路由
MapFallbackToController、MapFallbackToAreaController
指定無吻合規則時的預設路由
這個我有看半懂,大致上應該是定義列別的 class 方法的Route()
規則去註冊 endpoints。
MapDefaultControllerRoute
這篇ASP.NET Core 3.0中使用動態控制器路由 - LamondLu - 博客園有提到。
使用MapDefaultControllerRoute
等於寫
|
|
就不需要寫
|
|
但相對Controller
MapDynamicControllerRoute
ASP.NET Core 3.0中使用动态控制器路由 - LamondLu - 博客园
MapControllerRoute MapControllers MapDefaultControllerRoute
ASP.NET Core端点路由中三种让人困惑的路由函数 - 博客猿马甲哥 - 博客园
主要 MapControllerRoute MapControllers 剛學看到這兩個都不知道在幹嘛
endpoints.MapControllers();
會透過Controller下[Route("/")]
規則去套。
但是MapControllerRoute
是在定義路由,跟[Route("/")]
沒有關係,有點在宣告路由意思差不多。向下面這樣。
|
|
區域(Area)
實務上我還沒看過有人這樣用,看到文件有這個紀錄一下。
[ASP.NET Core] 為專案加上 Area | Ian Chen - 點部落
ApiController Attribute
[ApiController]
常常複製程式來改,最近思考這個是做什麼用。從保哥這篇得知如下。
連結:使用 ASP.NET Core 2.2 開發 Web API 的注意事項 | The Will Will Web。我發現滿多必看的
必須使用屬性路由(Attribute Routing)
只要發生模型驗證失敗,就會自動回應 HTTP 400 (Bad Request),並且以 ValidationProblemDetails 型別回應,預設的 JSON 結構如下:
…
我這邊找官網文件 使用 ASP.NET Core 建立 Web API | Microsoft Learn大概有五項。
-
屬性路由需求
[Route("[controller]")]
必需要加這一段,程式才可以跑。 -
HTTP 400 自動回應
[ApiController]
屬性會讓模型驗證錯誤自動觸發 HTTP 400 回應。
|
|
-
繫結來源參數推斷
就是指一般 Get, Post 會針對參數是[FormQuery]
,[FormBody]
這篇推薦看文件。 -
多部分/表單資料要求推斷
屬性 [ApiController] 會針對 型 IFormFile 別和 IFormFileCollection 的動作參數套用推斷規則。 系統會multipart/form-data
針對這些類型推斷要求內容類型。 -
錯誤狀態碼的問題詳細資料
MVC 會將錯誤結果 (狀態碼為 400 或更新版本的結果,) 轉換為具有 的結果 ProblemDetails 。 以 RFC 7807 規格為基礎的 ProblemDetails 類型,在 HTTP 回應中提供電腦可讀取的錯誤詳細資料。
建議點進去看。
不加[apicontroller]和一般controller差異在哪?
在 ASP.NET Core 中,[ApiController] 和普通的 Controller 類別有一些差異,包括:
[ApiController] 特性只能用於 Web API 控制器中。如果您想在 MVC 控制器中使用該特性,將會出現錯誤。
[ApiController] 特性會啟用一些默認的行為,以便更方便地在 Web API 中工作。例如,如果您在控制器中使用了 [ApiController] 特性,則您可以在控制器中使用 [FromBody] 和 [FromQuery] 屬性,而無需手動配置模型綁定。
[ApiController] 特性會啟用一些默認的錯誤處理行為,以便更方便地在 Web API 中工作。例如,如果您在控制器中使用了 [ApiController] 特性,則您的控制器將會自動回應 HTTP 400 錯誤(Bad Request),如果模型綁定失敗。
[ApiController] 特性會啟用一些默認的路由行為,以便更方便地在 Web API 中工作。例如,如果您在控制器中使用了 [ApiController] 特性,則您的控制器將會自動選擇基於 HTTP 請求類型的路由模板(例如 GET、POST 等)。
總之,[ApiController] 特性是一種方便的工具,可以幫助您更方便地在 Web API 中工作。然而,請注意,如果您在 MVC 控制器中使用了 [ApiController] 特性,則可能會出現一些問題,因為 MVC 控制器和 Web API 控制器的工作方式有所不同。因此,建議您只在 Web API 控制器中使用 [ApiController] 特性。
如果您想了解更多關於 [ApiController] 特性的信息,請參考 ASP.NET Core 文檔。
回去看還真的官方文章是在寫 WebAPI。
除了 ControllerBase ,那些 Controller Class 開發人員需要知道的東西?
在 ASP.NET Core 中,除了 ControllerBase 之外,還有其他幾種常用的 Controller 類別,包括:
Controller:這是最常用的 Controller 類別,可以用於實現 MVC 控制器。Controller 類別繼承自 ControllerBase 類別,並且提供了許多方便的功能,例如视图支持、模型綁定、模型驗證等。
ApiController:這是用於實現 Web API 控制器的類別,繼承自 ControllerBase 類別。ApiController 類別提供了許多方便的功能,例如自動模型綁定、自動錯誤處理、自動路由等。
ControllerBase:這是所有 Controller 類別的基類,包括 Controller 和 ApiController。ControllerBase 類別提供了許多基本的功能,例如 HTTP 請求處理、控制器生命週期等。
總之,開發人員需要知道這些 Controller 類別,以便在適當的情況下使用它們。請注意,每種類別都有自己的用途,
ASP.NET Web API 入門常用技巧 - Huan-Lin 學習筆記
其實寫完這章節發現這根路由沒關係,不過也了解一些東西就順便記。會不會再拆出來寫再看看。
其他文章
Vue Router 搭配 ASP.NET Core 3.1 時 設定history mode | 這是一隻間諜程式 - 點部落