Во всех моих проектах я помещаю этот код в свои контроллеры:
[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 в моем проекте Когда я решу изменить весь свой маршрут на новый, мне нужно заменить все RouteAttributes в моем проекте..
Я ищу глобальное решение, например, что-то вроде этого в моем файле program.cs:
app.MapControllerRoute(
name: "default",
pattern: "api/{controller}/{action}");
Проблема в том, что я не могу заставить этот код работать, когда удаляю RouteAttribute из своих API.
@MosiaThabo Моя проблема была о маршруте, но если у вас есть лучший способ указать Get или Post для каждого метода, я весь в ушах.





Просто следуйте этому простому руководству по Префикс глобального маршрута. Вам также придется удалить префикс маршрута поверх контроллера после добавления префикса глобального маршрута в ваш файл program.cs.
мой progam.cs
builder.Services.AddMvc(opt =>
{
opt.UseCentralRoutePrefix(new RouteAttribute("core/v1/[controller]/[action]"));
}
).AddControllersAsServices().AddNewtonsoftJson();
Спасибо за ваше время, но я нашел этот «префикс глобального маршрута» почти 2 года назад, но я не усложнял такие вещи, потому что, когда вы пытаетесь объяснить свой проект кому-то еще, это болезненно. Я знаю, что ваш метод работает, но добавьте больше времени, чем поставить Route поверх всех API.
Я искал это несколько часов, и в конце концов я не нашел простого решения для создания хорошего, простого и быстрого глобального маршрута для 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 Ну, это полезно, если вы решите изменить все свои маршруты сразу. Именно это мне нужно было сделать в одном из моих проектов. Затем мне пришлось изменить 30 файлов API.
Это то, что я вам советовал - определите глобальную константу "api/[controller]/[action]" и используйте ее везде, где хотите.
@Serge На самом деле это неплохая идея.
Почему вы устаете печатать
[Route("api/[controller]/[action]")]на каждом элементе управления, но не устаете печататьHttpPost,[HttpGet]аннотации к методам? Да брось...