Contents

Net Core 路由設定探討

之前寫.NET Core MVC裡面探討Services.AddMvcServices.AddMvcCore方法差異。
這邊只有簡單紀錄重點。

addMvcCore: 只包含MVC功能。所以Controller 用到JSON 回傳會錯誤。
addMvc: 包含MVC Core和相關第三方常用服務方法。

最近建立空白專案,發現所有 Startup.cs 都是空的。瞬間不知道要放什麼…
還是了解一下這些事做什麼,主要記錄這篇以後使用知道自己在幹嘛

Service 註冊設定

其實我後來發現 Visual Studio 會建議你設定 Services.AddMvc

https://i.imgur.com/UM8Xb1x.png

這個功能是最多的

Routing in ASP.NET Core | Microsoft Docs

設定我發現還滿多的

  • services.AddMvcCore()
  • services.AddControllers()
  • services.AddControllersWithViews()
  • services.AddRazorPages()
  • services.AddMvc()

這邊小記ASP.NET Core 練習 - 在 Razor Pages 專案加入 MVC-黑暗執行緒內容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
services.AddMvcCore()


只註冊運行 Controller/~~Razor Pages~~ 必要的核心服務,確保 Pipeline 程序可動作,其餘如像 Data Annotation Model Validation、身分驗證等服務要自己加掛,除有特殊客製需求,一般不太常用。
services.AddControllers()


包含 AddMvcCore() 所做的動作外,再加上:


   身分驗證服務
   Swagger/Open API 等 API 文件動態產生功能
   Data Annotation 支援 Attribute 資料檢核及 IValidateObject
   Formatter Mapping - 依 Request 需求提供不同格式(JSON/XML)內容
   CORS - 支援跨網域整合


要用 Controller 但不會用到 View,例如純 WebAPI,可以選這個。
services.AddControllersWithViews()


包含 AddControllers() 的所有項目,再加上:


   cshtml Razor View
   Cache Tag Helper

要使用標準 Model + View + Controller 架構,通常就選這個。
services.AddRazorPages()

包含 AddMvcCore() 所有功能,再加上:

   Razor Pages 功能
   身分驗證服務
   Data Annotation - 支援 Attribute 資料檢核及 IValidateObject
   Cache Tag Helper

services.AddMvc()

等於 AddControllersWithViews() 加 AddRazorPages(),不想漏掉功能發揮 ASP.NET Core 最大威力,選這個就對了。

這邊我懷疑只註冊運行 Controller/Razor Pages 必要的核心服務 寫錯了。

順便問 AI 大神。

https://user-images.githubusercontent.com/6058558/208949525-0f3b3742-b7a0-4596-8a69-59f41470abf1.png

最後再做個確認,可以推薦看一下 ASP.NET Core 中 AddMvc() 與 AddMvcCore() 的差別 - Yowko’s Notes這篇,真的去爬程式跑什麼。
現在老了看條列式有點吃力,我依照上面內文簡單用類別圖整理這個。方便以後查詢。

classDiagram AddMvcCore方法 <|-- AddControllers方法 AddControllers方法 <|-- AddControllersWithViews方法 AddMvcCore方法 <|-- AddRazorPages方法 AddRazorPages方法 <|-- AddMvc方法 AddControllersWithViews方法 <|-- AddMvc方法 class AddMvcCore方法{ - 只註冊運行 Controller 必要的核心服務 - 確保 Pipeline 程序可動作 } class AddControllers方法{ - 身分驗證服務 - Swagger/Open API 等 API 文件動態產生功能 - Data Annotation - 支援 Attribute 資料檢核及 IValidateObject - Formatter Mapping - 依 Request 需求提供不同格式[JSON/XML]內容 - CORS - 支援跨網域整合 } class AddControllersWithViews方法{ - cshtml Razor View - Cache Tag Helper } class AddRazorPages方法{ - Razor Pages 功能 - 身分驗證服務 - Data Annotation - 支援 Attribute 資料檢核及 IValidateObject - Cache Tag Helper } class AddMvc方法{ - AddControllersWithViews方法 加 AddRazorPages }

前陣子看微軟範例,我找不到 Controller 對應 View 的方法,後來發現他使用 Razor Pages,cshtml。因為我最近轉寫.Net Core不知道有這玩意,他方法大概有 GET,POST 方法,不過我朋友說現在很少在用。

可以看:

我後來仔細看AddRazorPagesAddControllersWithViews方法的東西好像都有包含,看不出來兩者差異,我後來有爬到

  1. [ASP.NET Core] AddController(), AddMvc(), AddControllersWithViews(), AddRazorPages() 차이점 :: 또치의 삽질 보관함
  2. AddController vs AddMvc vs AddControllersWithViews vs AddRazorPages

https://i.imgur.com/gvkbSCZ.png

AddRazorPages vs AddControllersWithViews

這邊先了解
https://user-images.githubusercontent.com/6058558/208950891-53237f45-8e2e-4853-a860-71cdf1275abf.png

在看上面問題。

就能看出AddRazorPagesAddControllersWithViews 差在API Explorer和 CORS和Formatter Mapping 。

這邊有問 AI 大大。
https://user-images.githubusercontent.com/6058558/208946803-f5909cb4-4ba3-44c4-946b-70f6c9f7548c.png
https://user-images.githubusercontent.com/6058558/208947528-ec6a3c63-0d1e-4ea5-88dd-6c01861b8660.png

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 是類似做初始化動作。

https://i.imgur.com/ARvlukV.png

我看官網文件也說到順序要這樣用。

https://i.imgur.com/80ye3mo.png

原來 Endpoints是重點。

後來我看到這篇Asp.Net Core EndPoint 終結點路由工作原理解讀 - 知乎有提到

  1. UseRouting() 、UseAuthorization()、UseEndpoints() 這三個中間件的關係是什麼呢?

答:UseRouing 中間件主要是路由匹配,找到匹配的終結者路由Endpoint ;UseEndpoints 中間件主要針對UseRouting 中間件匹配到的路由進行 委託方法的執行等操作。 UseAuthorization 中間件主要針對 UseRouting 中間件中匹配到的路由進行攔截 做授權驗證操作等,通過則執行下一個中間件UseEndpoints()

Endpoints 有哪些可以用?

平常我看到 Endpoints 看不出來在做什麼?稍微看一下文件有寫這些方法可以用。

https://i.imgur.com/onfCmS1.png

其實黑暗執行續那篇也有小記

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 - 博客園有提到。
https://i.imgur.com/3H4fU1o.png

使用MapDefaultControllerRoute等於寫

1
2
3
4
5
6
7
app.UseEndpoints(
    endpoints =>
    {
        endpoints.MapControllerRoute("default", 
                  "{controller=Home}/{action=Index}/{id?}");
    }
);

就不需要寫

1
2
3
   [Route("")]
   [Route("Home")]
   [Route("Home/Index")]

但相對Controller

MapDynamicControllerRoute

ASP.NET Core 3.0中使用动态控制器路由 - LamondLu - 博客园

MapControllerRoute MapControllers MapDefaultControllerRoute

ASP.NET Core端点路由中三种让人困惑的路由函数 - 博客猿马甲哥 - 博客园

主要 MapControllerRoute MapControllers 剛學看到這兩個都不知道在幹嘛

endpoints.MapControllers(); 會透過Controller下[Route("/")]規則去套。
但是MapControllerRoute是在定義路由,跟[Route("/")]沒有關係,有點在宣告路由意思差不多。向下面這樣。

1
2
3
4
5
    endpoints.MapControllerRoute(name: "blog",
                pattern: "blog/{*article}",
                defaults: new { controller = "Blog", action = "Article" });
    endpoints.MapControllerRoute(name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

區域(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 回應。

1
2
3
4
if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}
  • 繫結來源參數推斷
    就是指一般 Get, Post 會針對參數是[FormQuery],[FormBody]這篇推薦看文件。

  • 多部分/表單資料要求推斷
    屬性 [ApiController] 會針對 型 IFormFile 別和 IFormFileCollection 的動作參數套用推斷規則。 系統會 multipart/form-data 針對這些類型推斷要求內容類型。

  • 錯誤狀態碼的問題詳細資料
    MVC 會將錯誤結果 (狀態碼為 400 或更新版本的結果,) 轉換為具有 的結果 ProblemDetails 。 以 RFC 7807 規格為基礎的 ProblemDetails 類型,在 HTTP 回應中提供電腦可讀取的錯誤詳細資料。

建議點進去看。

問 CHATGPT 不加[apicontroller]和一般controller差異在哪?

不加[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 開發人員需要知道的東西?

除了 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 | 這是一隻間諜程式 - 點部落