我有一个名为 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
属性用于此属性的目的。
但斯瓦格告诉我,行动本身根本没有路线:显示的URL是https://localhost:port/WeatherForecast(服务操作可以通过该URL消费,我使用了Postman进行测试)
但是,如果设置了Name
属性的HttpGet
属性,我希望它是https://localhost:port/WeatherhForecast/GetWeatherForecast
当我在操作方法上额外使用Route
属性(Route("GetWeatherForecast")
)时,则操作的路由如下所示:https://localhost:port/WeatherhForecast/GetWeatherForecast(现在确实可以通过该URL访问服务操作)。
所以,问题是:为什么HttpGet
属性的Name
属性没有实现文档所承诺的功能?或者HttpGetAttribute.Name
的真正用途是什么?
源代码是用.NET 6.0和VS 2022制作的,项目类型为ASP.NET Core-Web-API。显示的代码来自项目模板自动创建的控制器。
2条答案
按热度按时间8aqjt8rx1#
使用
HttpGet
属性的方式:表示您指定的是
Name
属性,该属性不会更改生成路由的URL的方式。路由名称可用于生成使用特定路由的链接,而不是依赖于基于给定路由值集的路由选择。您应该指定
Template
属性,方法是排除具名参数或使用正确的名称:或者:
wlzqhblo2#
DavidG是对的。使用[HttpGet(“GetWeatherForecast”)]而不是[HttpGet(Name =“GetWeatherForecast”)]对我很有效。我在同一个问题上困了很多天,尝试了很多解决方法,并遵循了互联网上不同论坛上几乎所有的建议,但最有效的解决方案是删除控制器中的Name属性。
这确实是一个奇怪的事实,使用[HttpGet(Name =“GetWeatherForecast”)]确实可以像它所暗示的那样工作,如果您使用类似于
它也不是那样工作的。