Глобальный маршрут для всех ApiControllers в .Net 6

Во всех моих проектах я помещаю этот код в свои контроллеры:

[Route("api/[controller]/[action]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult GetTest1()
    {
        return Ok();
    }
    [HttpGet]
    public IActionResult GetTest2()
    {
        return Ok();
    }
    [HttpPost]
    public IActionResult PostTest1(string Request)
    {
        return Ok("value was " + Request);
    }
}

Таким образом, я могу вызывать свои API с именем действия без указания каждого маршрута действия, как показано ниже на картинке из моего чванства:

Глобальный маршрут для всех ApiControllers в .Net 6

Это работает нормально, но мне нужно поместить этот маршрут поверх всех моих ApiControllers в моем проекте Когда я решу изменить весь свой маршрут на новый, мне нужно заменить все RouteAttributes в моем проекте..

Я ищу глобальное решение, например, что-то вроде этого в моем файле program.cs:

app.MapControllerRoute(
    name: "default",
    pattern: "api/{controller}/{action}");

Проблема в том, что я не могу заставить этот код работать, когда удаляю RouteAttribute из своих API.

Почему вы устаете печатать [Route("api/[controller]/[action]")] на каждом элементе управления, но не устаете печатать HttpPost, [HttpGet] аннотации к методам? Да брось...

Mosia Thabo 14.05.2022 17:48

@MosiaThabo Моя проблема была о маршруте, но если у вас есть лучший способ указать Get или Post для каждого метода, я весь в ушах.

Ali Poustdouzan 14.05.2022 17:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто следуйте этому простому руководству по Префикс глобального маршрута. Вам также придется удалить префикс маршрута поверх контроллера после добавления префикса глобального маршрута в ваш файл program.cs.

моя наглость:

мой progam.cs

 builder.Services.AddMvc(opt =>
 {
     opt.UseCentralRoutePrefix(new RouteAttribute("core/v1/[controller]/[action]"));
 }

).AddControllersAsServices().AddNewtonsoftJson();

Спасибо за ваше время, но я нашел этот «префикс глобального маршрута» почти 2 года назад, но я не усложнял такие вещи, потому что, когда вы пытаетесь объяснить свой проект кому-то еще, это болезненно. Я знаю, что ваш метод работает, но добавьте больше времени, чем поставить Route поверх всех API.

Ali Poustdouzan 13.05.2022 16:50
Ответ принят как подходящий

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

Решение 1: Вы можете создать базовый класс для своих API и поместить свой маршрут в этот файл. Затем вы наследуете только этот класс во всех своих API.

Файл APIBase.cs:

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

Следующий шаг: если вам нужен идентификатор (или любой другой параметр) в вашем URL-адресе, вам следует добавить RouteAttribute только для этого метода.

Файл ValuesController.cs:

public class ValuesController : APIBase
{
    [HttpGet]
    public IActionResult GetTest1()
    {
        return Ok();
    }
    [HttpGet]
    [Route("{id?}")]
    public IActionResult GetTest2(int id)
    {
        return Ok("value was " + id);
    }
    [HttpPost]
    public IActionResult PostTest1(string Request)
    {
        return Ok("value was " + Request);
    }
}

Редактировать :

Решение 2: Вы можете создать строку const в своем проекте и использовать ее во всех API (предложено @Serge)

Файл HelperStatic.cs:

public static class HelperStatic
{
    public const string BaseAPIRoute = "api/[controller]/[action]";
}

Файл ValuesController.cs:

[ApiController]
[Route(HelperStatic.BaseAPIRoute)]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult GetTest1()
    {
        return Ok();
    }
    [HttpGet]
    [Route("{id?}")]
    public IActionResult GetTest2(int id)
    {
        return Ok("value was " + id);
    }
    [HttpPost]
    public IActionResult PostTest1(string Request)
    {
        return Ok("value was " + Request);
    }
}

И ваше swagger будет таким (в обоих решениях):

Вместо добавления всего одной строки [Route("api/[controller]/[action]")] вы добавили весь базовый контроллер с одной и той же строкой. Сделал просто строку const, если вам больше нечего делать

Serge 13.05.2022 18:37

@Serge Ну, это полезно, если вы решите изменить все свои маршруты сразу. Именно это мне нужно было сделать в одном из моих проектов. Затем мне пришлось изменить 30 файлов API.

Ali Poustdouzan 14.05.2022 00:18

Это то, что я вам советовал - определите глобальную константу "api/[controller]/[action]" и используйте ее везде, где хотите.

Serge 14.05.2022 00:23

@Serge На самом деле это неплохая идея.

Ali Poustdouzan 14.05.2022 17:25

Другие вопросы по теме