小心ASP.NET Core裡Async結尾Action方法!

小心ASP.NET Core裡Async結尾Action方法!

在測試一段非同步程碼時,發現一個 ASP.NET Core 裡 Route 有趣現象。平常為了測試方便,習慣會修改預設路由規則,例如將 ASP.NET Core Web API Route("api/[controller]") 改為 Route("ControllerName/[action]")

我們建立一個全新 ASP.NET Core Web API:

dotnet new webapi -o routeasyncsample

修改預設範例 WeatherForecastController 的屬性路由:Route("[controller]") 修改為 Route("WeatherForecast/[action]"),儲存之後,以 dotnet run 啟動後存取此 URI:

  • http://localhost:5000/WeatherForecast/Get

確定運作正常後,我們加入一個簡單的 DemoAsync() Action 方法。

[HttpGet]
public IActionResult DemoAsync()
{
    return Content("From GetAsync");
}

這原本應該是一段非同步程式,但我們只是要重現問題,只在命名上加上 *Async 尾綴。

  • http://localhost:5000/WeatherForecast/DemoAsync

很直覺的進行 DemoAsync 資源請求,但你會發現會得到 404 Not Found

404 Not Found

解法呢?也很簡單,忽略 Async 尾綴,以 Demo 來請求資源。

  • http://localhost:5000/WeatherForecast/Demo

目前測過ASP.NET Core 的 MVC, Web API 都能重現此問題。為了預防眼睛業障重,特此筆記。

感謝網友提供 https://github.com/dotnet/aspnetcore/issues/8998 討論串,看起來開發團隊未來會修掉此問題。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。