VS2022 React预览项目模板:客户端与控制器通信机制解析
你之所以用fetch('weatherforecast')就能命中控制器的Get()方法,而非指定方法名,本质是ASP.NET Core Web API的约定式路由+HTTP动词自动匹配规则在起作用,具体拆解如下:
1. 控制器路由的默认约定
你的控制器类名应该是WeatherForecastController(VS模板默认命名)。ASP.NET Core框架会自动识别控制器类名的Controller后缀,将前缀WeatherForecast作为路由的核心段——也就是URL中的weatherforecast。
项目模板的路由配置(一般在Program.cs中)会包含app.MapControllers();,配合控制器上的[ApiController]特性,默认启用基于[controller]的路由模板,无需手动给控制器添加[Route]特性就能生成路由。
2. HTTP动词与动作方法的自动匹配
你的控制器方法是Get(),没有添加额外的路由特性(比如[HttpGet("GetWeatherForecast")])。此时框架会根据方法名的前缀(Get/Post/Put/Delete等)自动绑定对应的HTTP动词:
- 以
Get开头的方法,默认匹配GET请求 - 以
Post开头的方法,默认匹配POST请求
当你调用fetch('weatherforecast')时,fetch默认发起的是GET请求,框架会自动找到WeatherForecastController中匹配GET动词的Get()方法来处理请求,不需要在URL里指定方法名。
3. 为什么你的预期写法不生效
如果你想通过fetch('GetWeatherForecast')调用,需要给控制器方法添加显式的路由特性,比如:
[HttpGet("GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() { // 方法逻辑 }
此时URL才需要写成/weatherforecast/GetWeatherForecast(或者如果控制器有路由前缀,按规则拼接)。但VS默认的React+Web API模板采用的是RESTful风格的约定式路由,不会给方法添加这类显式路由,所以直接用控制器路由段+HTTP动词就能匹配。
内容的提问来源于stack exchange,提问作者user2049142

