在 .net 8 中使用傳統的 WebAPI 專案範本

前幾天上課的時候,發現原本可以順暢使用的 LINE Bot WebHook Template (自動建立LINE Bot WebHook API專案的範本)突然間不能用了,學員哀號,身為現場指導老師,我當然跑不掉。

走向前往學員的電腦上一看,發現整個操作動作並無不妥:

dotnet new webapi
dotnet add package linebotsdk
dotnet new install isRock.Template.LineWebHook
dotnet new linewebhook

但依照過去的做法,使用瀏覽器讀取 http://localhost:???/api/LineBotChatGPTWebHook

結果出現
圖片

不對,照說透過我們 template 建立出來的 WebAPI ,其程式碼的內容應該是:

namespace isRock.Template
{
    public class LineBotChatGPTWebHookController : isRock.LineBot.LineWebHookControllerBase
    {
        [Route("api/LineBotChatGPTWebHook")]
        [HttpPost]
        public IActionResult POST()
        {
(...略...)

這段 code 所產生的 WebAPI 就算不能使用瀏覽器以 http get 方式讀取,也應該是得到 http 405 method not allowed 而非 404 啊,這怎麼回事呢?

估計應該是 Route 沒抓到,查看 Program.cs ,Routing 的設定怎麼變成底下這個樣子了?

pp.MapGet("/weatherforecast", () =>
{
    var forecast =  Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();

app.Run();

一問之下,果不其然。這位學員安裝了 .net 8

從 .net 8 開始,如果你使用 dotnet new webapi 這樣的 CLI 指令建立 WebAPI ,你得到的並非傳統的 Controller WebAPI ,而是 Minimal API

WHY ???

在 .NET 8 中預設使用 Minimal API 作為 WebAPI 的範本,其主要原因是性能和原生 Ahead-of-Time (AOT) 編譯支援。如此一來,預設採用 Minimal API 的 WebAPI ,在建置階段應用程式即可通過原生 AOT 編譯獲得更小的部署大小、更快的啟動速度以及更低的記憶體使用量。此外,Minimal API 的設計強調減少程式碼配置的複雜性,使其成為構建微服務和高性能後端 API 的理想選擇​​。

簡單的說,就是配合微服務和 API 時代的來臨啦。
但 Minimal API 並非全是優點。

Minimal API 的設計注重簡單,因此缺乏傳統基於 ControllerBase 的 API 的靈活性。例如,對於 filter、authtication、可測試性…等的支援就明顯不如傳統的 WebAPI,也無法有效地處理複雜的數據類型。

因此,倘若你想在 .net 8 建立傳統的 WebAPI 也不是不行。 在 .NET 8 中,要創建一個不是 Minimal API 的傳統 Web API,你可以使用以下CLI命令:

dotnet new webapi --use-controllers 

你會發現,它又把傳統的 Controller API還給你了:
圖片

在技術更迭這麼迅速的這個時代,使用最新的技術,可能不再是最好的選擇,只有適合自己團隊和當前專案的技術,才是正解。

ref:
https://learn.microsoft.com/zh-tw/training/paths/aspnet-core-minimal-api/

留言

這個網誌中的熱門文章

使用Qdrant向量資料庫實作語意相似度比對

專業的價值...

VS Code Terminal 的編碼問題

讓 LINE Bot 對談機器人顯示 "Loading..." 動畫

在Windows Phone (WP8) 中使用SignalR