asp.net HttpGetAttribute名称属性不适用于路由

kse8i1jr  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(243)

我有一个名为 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。显示的代码来自项目模板自动创建的控制器。

8aqjt8rx

8aqjt8rx1#

使用HttpGet属性的方式:

[HttpGet(Name = "GetWeatherForecast")]

表示您指定的是Name属性,该属性不会更改生成路由的URL的方式。路由名称可用于生成使用特定路由的链接,而不是依赖于基于给定路由值集的路由选择。
您应该指定Template属性,方法是排除具名参数或使用正确的名称:

[HttpGet("GetWeatherForecast")]

或者:

[HttpGet(Template = "GetWeatherForecast")]
wlzqhblo

wlzqhblo2#

DavidG是对的。使用[HttpGet(“GetWeatherForecast”)]而不是[HttpGet(Name =“GetWeatherForecast”)]对我很有效。我在同一个问题上困了很多天,尝试了很多解决方法,并遵循了互联网上不同论坛上几乎所有的建议,但最有效的解决方案是删除控制器中的Name属性。
这确实是一个奇怪的事实,使用[HttpGet(Name =“GetWeatherForecast”)]确实可以像它所暗示的那样工作,如果您使用类似于

routes.MapGet("/api/Pnrlog/{id}", (int id) =>
        {
            return new Pnrlog { PnrlogId = id };
        })
        .WithName("GetPnrlogById");

它也不是那样工作的。

相关问题