Создать неоднозначный маршрут в .NET Core MVC

#asp.net-core-mvc

#asp.net-core-mvc

Вопрос:

Раньше у меня было приложение NET Web API (4.6.2), в котором было несколько неоднозначных маршрутов. Что-то вроде этого:

 [RoutePrefix(RoutePrefix)]
public class TestController : ApiController
{
public const string RoutePrefix = "test";

[HttpGet, Route("")]
public IHttpActionResult GetAll(Guid uid, [FromUri]int limit, [FromUri]int offset)
{
  // Logic Here.
}

[HttpGet, Route]
public async Task<IHttpActionResult> Test([FromUri]Guid id, [FromUri]int? limit = null, [FromUri]int? offset = null)
{
  // Logic Here.
}
}
  

Все это работало в прошлом, потому что у меня была эта настройка при запуске:

 config.MapHttpAttributeRoutes();
  

Проблема в том, что я конвертирую этот API в NET Core MVC API, и параметр MapHttpAttributeRoutes больше не доступен. Это означает, что прямо сейчас у меня возникают некоторые проблемы с неоднозначностью некоторых действий (например, упомянутого выше).

Я знаю, что один из способов обойти это (и я хочу сделать это в будущем) — иметь определенный маршрут для каждого действия. На данный момент и на основе использования этого API я не могу изменить все маршруты. Учитывая все это, мне было интересно, нашел ли кто-нибудь способ справиться с этой ситуацией без изменения маршрутов?

Спасибо вам, ребята.

Ответ №1:

Неоднозначный маршрут не поддерживается ASP.NET Ядро и на самом деле не поддерживаются более поздними версиями even Web Api, насколько мне известно. В ASP.NET Ядро, в частности, маршрутизирует короткие замыкания, поэтому оно всегда будет выбирать первое приемлемое соответствие и никогда не будет рассматривать что-либо еще. Единственный вариант — назначить уникальные маршруты для каждого действия или объединить логику двух действий в одно действие.

Тем не менее, не имеет смысла, почему у вас здесь два разных действия в первую очередь. Между этими двумя нет функциональной разницы, за исключением того, что первый заполнит значения по умолчанию в параметрах, в то время как второй заполнит значения null. Все параметры действия по умолчанию необязательны. Связующее устройство модели автоматически привяжет значение по умолчанию / null к каждому параметру, если в запросе ничего нет для заполнения. Если вы хотите, чтобы последние два параметра были обнуляемыми, тогда просто используйте эту подпись, а затем вы можете изменять в рамках действия, имеют ли они значение или нет.