Маршрутизация .Net Core 2.2 Web API - PullRequest
2 голосов
/ 15 марта 2019

У меня есть следующий контроллер, который я хотел использовать в качестве контроллера Web API для записей ajax для извлечения данных из моей пользовательской таблицы.

namespace MyProjectName.Controllers.API
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly myContext _context;
        public UsersController(myContext context)
        {
            _context = context;
        }

        [HttpGet]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    }
}

Теперь я ожидаю, что маршрутизация этой функции будеткак это: / api / users / getinstitutionnamesbyid , но, похоже, это просто / api / users , что меня очень смущает (что, если я добавлю дополнительные функции HttpGet?).

Может кто-нибудь объяснить мне, что я делаю не так?Я использую контроллеры Web Api не по назначению?Мой маршрут неправильный?

Заранее спасибо.

Ответы [ 2 ]

10 голосов
/ 15 марта 2019

[Route("api/[controller]")]

С этим шаблоном вы явно заявляете, что вам важно только имя контроллера. В вашем примере GetInstitutionNamesById - это имя действия , которое не рассматривается шаблоном.

Здесь есть несколько вариантов достижения того, о чем вы просите:

  1. Измените шаблон [Route], включив в него название действия:

    [Route("api/[controller]/[action]")]
    

    Эта опция применяется ко всем действиям внутри вашего контроллера.

  2. Измените атрибут ограничения HttpGet, чтобы указать действие неявно :

    [HttpGet("[action]")]
    

    Эта опция гарантирует, что имя вашего метода действия всегда будет использоваться в качестве маршрута сегмент.

  3. Измените атрибут ограничения HttpGet, чтобы указать действие явно :

    [HttpGet("GetInstitutionNamesById")]
    

    Этот параметр позволяет использовать сегмент маршрута, который отличается от имени самого метода действия.

С точки зрения того, правильно ли вы здесь используете маршрутизацию - это несколько основано на мнении. Как правило, вы увидите, что API пытаются быть RESTful, используя шаблоны маршрутов, соответствующие ресурсам и т. Д. При таком подходе вы можете получить что-то более похожее на следующее:

/api/Users/{userId}/InstitutionNames

В этом случае у вас может быть отдельный контроллер InstitutionNames или вы можете подключить его к контроллеру Users. Есть действительно много способов сделать это, но я не буду вдаваться в подробности здесь, поскольку это немного не по теме и основано на мнениях.

2 голосов
/ 15 марта 2019

Вам просто нужно назвать это так

    [HttpGet("[action]/{id}")]
    public List<string> GetInstitutionNamesById(int id)
    {
        // returns desired list
    }

и из вызова ajax / api / users / GetInstitutionNamesById / 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...