我正在尝试使用三个 get 方法创建一个非常基本的 Controller
以下是他们的三个 uri
我的 Controller 代码如下
[Route("api/[controller]")]
[ApiController]
public class MoviesController : ControllerBase
{
private readonly IMoviesService moviesService;
public MoviesController(IMoviesService moviesService)
{
this.moviesService = moviesService;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var result = await moviesService.GetMoviesAsync();
return Ok(result);
}
[HttpGet]
public async Task<IActionResult> GetByName([FromQuery(Name = "name")] string name)
{
var result = await moviesService.GetMoviesByNameAsync(name);
return Ok(result);
}
[HttpGet("{Id}", Name = "GetById")]
public async Task<IActionResult> GetById(Guid Id)
{
var result = await moviesService.GetMovieById(Id);
return Ok(result);
}
}
当我通过 api/movies/31234567-89ab-cdef-0123-456789abcdef
向 GetById 发送请求时,它就起作用了但是对于
api/movies
和 api/movies?name=Test
我得到以下错误The request matched multiple endpoints. Matches: MoviesController.Get and MoviessController.GetByName
任何人都可以建议我考虑到最佳实践,在 web api .net core 3.1 中实现这种场景的最佳方法是什么?
最佳答案
您的 Get
和 GetByName
操作没有为它们提供属性路由,并且都与“api/Movies”匹配。为了解决这个问题,您还需要为这些操作中的至少一个添加一个路由模板。
一个可能的解决方案是:
[HttpGet]
public async Task<IActionResult> Get()
{
var result = await moviesService.GetMoviesAsync();
return Ok(result);
}
[HttpGet]
[Route("{name}")]
public async Task<IActionResult> GetByName([FromRoute] string name)
{
var result = await moviesService.GetMoviesByNameAsync(name);
return Ok(result);
}
请注意,此处具有特定名称的电影的 url 不再是/movies?name={name},而是/movies/{name}。如果您绝对希望保留 URL/movies?name={name},您可以将
Get
和 GetByName
操作合并到一个接受查询字符串参数 name
并根据其值执行您的逻辑的操作中。
关于.net - .net core 3.1 web api 中的多个 get 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64137002/