Извините за название, я не разбираюсь в них, дайте мне знать, если вы знаете какой-нибудь заголовок, который лучше описывает содержание вопроса.
Итак, у меня есть 2 метода: первый - получить все элементы списка, а второй - получить все элементы списка, однако во втором методе есть параметр запроса, который я использую для фильтрации, а второй - Метод также возвращает объект, отличный от первого. Поскольку у меня есть 2 метода Http get, которые идут по одному и тому же маршруту, когда я вызываю один из методов, которые я получаю:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: запрос соответствует нескольким конечным точкам. Матчи: .....
Как мне решить эту проблему без объединения двух методов, использования дополнительных параметров или изменения пути к одному методу? если возможно??
пример кода:
// GET: api/Resources
[HttpGet]
public async Task<ActionResult<ICollection<Data>>> GetAll()
{
return Ok(await Service.GetAll());
}
// GET: api/Resources
[HttpGet]
public async Task<ActionResult<Data2>> GetAll([FromQuery]int parameter)
{
return Ok(await Service.GetAll2(parameter));
}
Внутри метода настройки у меня есть:
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
Изменить: попытался, как было предложено в комментариях, использовать действия в такой конфигурации ...
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("default", "{controller}/{action}/{id?}");
});
Это не сработало, потому что когда я делаю запрос на получение, например, для первого метода getall, вызывается неправильный метод: api / resources / getall, метод ниже запускается, вместо этого вызывая ошибку, поскольку getall не является int ...
// GET: api/Resources/5
[HttpGet("{id}")]
public async Task<ActionResult<Data>> GetById(int id)
{
return Ok(await Service.GetById(id));
}
пример воспроизведения ›› https://drive.google.com/open?id=15EB1_kK-c_qyhRS0QvVlKnhuUbFjyN12
Теперь действия работают, пришлось изменить маршрутизацию атрибутов в контроллере ...
[Route("api/[controller]/[action]")]
[ApiController]
public class ResourcesController : ControllerBase
{
// GET: api/Resources/GetAll
[HttpGet]
public ActionResult<ICollection<string>> GetAll()
{
return Ok(new List<string>() { "foo", "bar" });
}
// GET: api/Resources/GetAll2?parameter="bar"
[HttpGet]
public ActionResult<string> GetAll2([FromQuery]string parameter)
{
return Ok(parameter);
}
// GET: api/Resources/GetById/5
[HttpGet("{id}")]
public ActionResult<int> GetById(int id)
{
return Ok(id);
}
}
Хотя, поскольку этого невозможно добиться без разных путей, я собираюсь изменить путь только к одному методу вместо использования действий в контроллере и добавления имени действия в путь при вызове методов.
Обновление 1. Несколько недель спустя я обнаружил кое-что еще, что может работать (не тестировалось), - это использование ограничений маршрута, как показано в это видео.
Обновление 2. Спустя почти год я решил найти ограничения параметров запроса и наткнулся на этот вопрос в stackoverflow, с ответом, что это невозможно, хотя вопрос довольно старый, поэтому ...