. Net Core Web API, создайте лог c маршрутизации к разным контроллерам с одинаковым префиксом маршрута на основе значения - PullRequest
2 голосов
/ 06 августа 2020

Мне нужно создать журнал маршрутизации c для проекта. Net Core 3.0 Web API, который маршрутизирует на разные контроллеры с одинаковым префиксом маршрута с заданным значением.

Пример: у меня есть контроллеры на основе состояния.

StateUsersCOController
StateUsersCAController
StateUsersWAController

и т. д.

Все они реализуют один и тот же метод, например:

GetUsers();

Я хочу достичь того, чтобы мой запрос был перенаправлен на связанный контроллер на основе информации о состоянии, такой как:

api/StateUsers/CA

или

api/StateUsers?state=CA

или

api/StateUsers and Request Header has the state Information such as State:CA

Я могу создать контроллер с именем StateUsers, захват значение состояния одним из указанных выше способов и перенаправить запрос на связанный контроллер, но я хочу избежать перенаправления и добиться, чтобы это был уровень маршрутизации. Не могли бы вы, ребята, предоставить лучший способ сделать это.

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Маршрутизация атрибутов с фиксированными шаблонами маршрутов должна иметь возможность однозначно различать контроллеры

[ApiController]
[Route("api/StateUsers/CO")]
public class StateUsersCOController : Controller {
    //GET api/StateUsers/CO
    [HttpGet]
    public IActionResult GetUsers() {
        //...
    }
}

[ApiController]
[Route("api/StateUsers/CA")]
public class StateUsersCAController : Controller {
    //GET api/StateUsers/CA
    [HttpGet]
    public IActionResult GetUsers() {
        //...
    }
}

[ApiController]
[Route("api/StateUsers/WA")]
public class StateUsersWAController : Controller {
    //GET api/StateUsers/WA
    [HttpGet]
    public IActionResult GetUsers() {
        //...
    }
}

Обратите внимание на удаление GetUsers из маршрута, чтобы упростить RESTFul URL.

Если вы настаиваете на включении GetUsers в URL-адрес, включите его в шаблон маршрутизации.

Ссылка Маршрутизация к действиям контроллера в ASP. NET Core

Ссылка Маршрутизация в ASP. NET Ядро

0 голосов
/ 06 августа 2020

Вы можете определить маршрут для него с помощью атрибута route, насколько я понимаю, вы не хотите иметь 3 разных контроллера, чтобы избежать дублирования кода, поэтому вы можете попробовать что-то вроде:

namespace Controllers
{
    [ApiController]
    [Route("api/stateusers")]
    public class StateUsersController : ControllerBase
    {
        public StateUsersController()
        {
        }

        // GET api/stateusers/getusers/{state}
        [HttpGet]
        [Route("getusers/{state}")]
        public async Task<IActionResult> GetUsers(string state)
        {
            //Implement your logic
        }
        
        //Or
        
        // GET api/stateusers/{state}
        [HttpGet]
        [Route("{state}")]
        public async Task<IActionResult> GetUsersByState(string state)
        {
            //Implement your logic
        }
    }
}

Примечание: я бы посоветовал вам заглянуть на следующий веб-сайт Руководство по именованию ресурсов REST , где вы можете проверить рекомендации по именованию RESTful API.

...