小心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
。
解法呢?也很簡單,忽略 Async 尾綴,以 Demo 來請求資源。
- http://localhost:5000/WeatherForecast/Demo
目前測過ASP.NET Core 的 MVC, Web API 都能重現此問題。為了預防眼睛業障重,特此筆記。
感謝網友提供 https://github.com/dotnet/aspnetcore/issues/8998 討論串,看起來開發團隊未來會修掉此問題。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。