【问题标题】:HttpGetAttribute name property not working for routingHttpGetAttribute 名称属性不适用于路由
【发布时间】:2022-11-01 13:58:51
【问题描述】:

我有一个名为的 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 向我展示了操作本身根本没有路线: 显示的网址是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。显示的代码来自项目模板自动创建的控制器。

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-web-api-routing


    【解决方案1】:

    您使用 HttpGet 属性的方式:

    [HttpGet(Name = "GetWeatherForecast")]
    

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

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

    [HttpGet("GetWeatherForecast")]
    

    或者:

    [HttpGet(Template = "GetWeatherForecast")]
    

    【讨论】:

    • 非常感谢您的澄清!似乎我混淆了这两个属性并忽略了 HttpGet 的默认构造函数
    【解决方案2】:

    大卫G是对的。使用 [HttpGet("GetWeatherForecast")] 而不是 [HttpGet(Name = "GetWeatherForecast")] 对我有用。我在同一个问题上停留了很多天,尝试了很多解决方法,并遵循了不同论坛上互联网上几乎所有可用的建议,但像魅力一样起作用的解决方案是删除控制器内的 Name 属性。

    这确实是一个奇怪的事实,使用 [HttpGet(Name = "GetWeatherForecast")] 确实有效,因为它暗示它会起作用,如果你使用类似的东西

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

    它也不能那样工作....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2021-02-28
      • 2013-08-04
      • 2020-10-12
      • 2016-07-06
      相关资源
      最近更新 更多