在 .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/
留言