HttpGetAttribute 名称 属性 不适用于路由

HttpGetAttribute name property not working for routing

我有一个名为 WeatherForecast 的 WebAPI 控制器,只有一个操作。操作方法如下:

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = Random.Shared.Next(-20, 55),
        Summary = Summaries[Random.Shared.Next(Summaries.Length)]
    })
    .ToArray();
}

但是,HttpGet.Name = "GetWeatherForecast" 应该定义一个路由名称“GetWeatherForecast”,因为我理解 Name 属性 对这个属性的用途。

但是 Swagger 告诉我操作本身根本没有路由: 显示的URL是https://localhost:port/WeatherForecast (服务操作可以通过那个消费URL,我用Postman测试)

但是对于设置了 Name 属性 的 HttpGet 属性,我希望它是 https://localhost:port/WeaterhForecast/获取天气预报

当我在操作方法上额外使用了Route属性(Route("GetWeatherForecast")),那么操作的路径如下:https://localhost:port/WeaterhForecast /获取天气预报 (现在确实可以通过 URL 访问服务操作)。

所以,问题是:为什么 HttpGet 属性的 Name 属性 没有按照文档承诺的那样执行?或者 HttpGetAttribute.Name 的真正用途是什么?

源代码是使用 .NET 6.0 和 VS 2022 制作的,项目类型 ASP.NET Core-Web-API。显示的代码来自项目模板自动创建的控制器。

您使用 HttpGet 属性的方式:

[HttpGet(Name = "GetWeatherForecast")]

表示您正在指定 Name 属性,这不会改变路由的 URL 的生成方式。路由名称可用于使用特定路由生成 link,而不是依赖于基于给定路由值集的路由选择。

相反,您应该通过排除命名参数或使用正确的名称来指定 Template 属性:

[HttpGet("GetWeatherForecast")]

或者:

[HttpGet(Template = "GetWeatherForecast")]