Как я могу определить маршрут для RestAPI при запуске в ASP. NET Core? - PullRequest
0 голосов
/ 10 июля 2020

Я знаю, как определить маршрут с помощью атрибута, например:

    [Route("api/v1/[controller]")]
    [ApiController]
    public class OTGController
    {
        [HttpGet("UpdateData")]
        public void UpdateData()
        {
            // to do...
        }
    }

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

Во-первых, маршрут для контроллера всегда: «api / v1 / [controller]». Я не хочу настраивать его на каждом контроллере.

Во-вторых, маршрут для UpdateData - «UpdateData». Они одинаковые. Я хочу определить его как:

        [HttpGet]
        public void UpdateData()
        {
            // to do...
        }

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

Мне нужен мой последний код, например:

    [ApiController]
    public class OTGController
    {
        [HttpGet]
        public void UpdateData()
        {
            // to do...
        }
    }

В этом классе не определен маршрут, и маршрут должен быть сгенерирован успешно согласно правилу, которое я настраиваю при запуске. Как?

1 Ответ

1 голос
/ 10 июля 2020

Решение 1:

Вы можете переопределить промежуточное ПО по умолчанию EndpointMiddleware. Обновите функцию Configure(IApplicationBuilder app, IWebHostEnvironment env) в классе Startup.

...
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        "Default",
        "api/v1/{controller}/{action=UpdateData}"
    );
});
...

Предупреждение: Вам необходимо удалить ApiControllerAttribute на контроллере (ах) Api. ). Методы действий на контроллерах, помеченных ApiControllerAttribute, должны быть перенаправлены по атрибутам.

Решение 2:

Вы всегда можете создать базовый класс контроллера API.

[ApiController]
[Route("api/v1/[controller]")]
public class ApiControllerBase : ControllerBase
{
    [HttpGet("")]
    public virtual IActionResult UpdateData()
    {
        return NoContent();
    }
}

public class OTGController : ApiControllerBase
{
    public override IActionResult UpdateData()
    {
        return Ok("Updated!");
    }
}

Решение 3:

EndpointMiddleware конфигурация:

...
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        "Default",
        "api/v1/{controller}/{action=UpdateData}"
    );

    endpoints.MapControllers();
});
...

Контроллеры:

[ApiController]
[Route("api/v1/[controller]")]
public class ApiControllerBase : ControllerBase
{
}

public class OTGController : ApiControllerBase
{
    public IActionResult UpdateData()
    {
        return Ok("Updated!");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...