gpt4 book ai didi

asp.net-web-api - Web Api Core 2 区分 GET

转载 作者:行者123 更新时间:2023-12-02 00:41:02 24 4
gpt4 key购买 nike

为什么 Web API Core 2 不能区分这些?

    [HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}

// GET api/values?name=dave
[HttpGet]
public string Get(string name)
{
return $"name is {name}";
}

这是发生了什么——

http://localhost:65528/api/valueshttp://localhost:65528/api/values?name=dave 都导致第一个 Get() 方法来执行。

这段代码在 Web Api 2 中运行良好。

know multiple解决这个问题的方法,但我不知道为什么它会发生。

有人能解释一下为什么会这样吗?

最佳答案

我认为您甚至无法在 ASP.NET Core Mvc 2.0 中编译您的代码,因为您有 2 个操作映射到同一路由 [HttGet] api/values :

AmbiguousActionException: Multiple actions matched.

请记住,ASP.NET Web API 使用 HTTP 谓词作为请求的一部分来确定调用哪个操作。尽管它使用常规路由(您将操作命名为 Get、Post、Put 和 Delete 等),但如果您没有指定路由属性,我强烈建议始终使用路由属性来注释您的 Controller 和操作。

API 设计时间

现在轮到您作为开发人员来设计路线了。请记住,路由应该是一个可以识别资源的 Uri

  • 使用名称作为标识符以及路线

    [Route("api/[controller]")]
    public class CustomersController : Controller
    {
    // api/customers
    [HttpGet]
    public IActionResult Get()
    {
    ...
    }

    // api/customers/dave
    [HttpGet("{name:alpha}")] // constraint as a string
    public IActionResult GetByName(string name)
    {
    ...
    }
    }
  • 使用名称作为过滤器,针对资源集合

    [Route("api/[controller]")]
    public class CustomersController : Controller
    {
    // api/customers
    // api/customers?name=dave
    [HttpGet]
    public IActionResult Get(string name)
    {
    ...
    }
    }

让你更加迷惑

api/customers/dave 仍然会先执行 GetById!

[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{
...
}

[HttpGet("{name}")]
public IActionResult GetByName(string name)
{
...
}

[HttpGet("{id}")]
public IActionResult GetById(int id)
{
...
}
}

方法 GetByNameGetById 都是潜在的候选方法,但 MVC 首先选择 GetById 方法,因为 MVC 比较方法/模板名称 { name}{id} 通过不区分大小写的字符串比较,并且 in 之前。

这就是您要施加约束的时候。

[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{
...
}

// api/customers/dave
[HttpGet("{name:alpha}")]
public IActionResult GetByName(string name)
{
...
}

// api/customers/3
[HttpGet("{id:int}")]
public IActionResult GetById(int id)
{
...
}
}

您也可以指定顺序!

[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{
...
}

// api/customers/portland
[HttpGet("{city:alpha}", Order = 2)]
public IActionResult GetByCity(string city)
{
...
}

// api/customers/dave
[HttpGet("{name:alpha}", Order = 1)]
public IActionResult GetByName(string name)
{
...
}

// api/customers/3
[HttpGet("{id:int}")]
public IActionResult GetById(int id)
{
...
}
}

如果没有 OrderGetByCity 方法将优于 GetByName,因为 {city} 的字符 c > 出现在 {name} 的字符 n 之前。但是如果您指定顺序,MVC 将根据 Order 选择操作。

唉帖子太长了....

关于asp.net-web-api - Web Api Core 2 区分 GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com