Как установить один и тот же шаблон маршрута в другом контроллере - PullRequest
1 голос
/ 11 октября 2019

Я получил код от другой команды, это веб-API .net core 2.2 с контроллером: CustomerDemandController, и мне нужно создать еще один (ManagerDemandController) с почти такими же методами. В обоих контроллерах у меня есть метод «Get by Id». который выглядит следующим образом:

[ApiVersion(Constants.LatestVersion)]
[Route("api/{version:apiVersion}/[controller]/")]
[ControllerName("customerdemands")]
[Produces("application/json")]
[EnableCors("SiteCorsPolicy")]
public class CustomerDemandController : ControllerBase
{
    private const string GetByIdOperation = "GetById";

    [Get("{id}", Name = GetByIdOperation)]
        public async Task<ActionResult<CustomerDemandResponse>> GetAsync([FromRoute] string id)
            => await this.GetAsync(() => Service.GetByIdAsync(id),
                                   ConversionHelper.Convert);

    ...

(тот же метод в другом контроллере с ManagerDemandResponse в качестве ответа). Теперь, когда я добавил новый контроллер, я хочу проверить, работает ли старый, и это больше не так из-за того, что в обоих контроллерах используется одинаковое имя маршрута «GetById».

Система. InvalidOperationException: Следующие ошибки произошли с информацией о маршрутизации атрибута:

Ошибка 1: Маршруты атрибутов с одинаковым именем 'GetById' должны иметь один и тот же шаблон: Действие: 'DemandManagement.Api.Controllers.CustomerDemandController.GetAsync (DemandManagement. Api) '- Шаблон:' api / {версия: apiVersion} / customerdemands / {id} 'Действие:' DemandManagement.Api.Controllers.ManagerDemandController.GetAsync (DemandManagement.Api) '- Шаблон:' api / {версия: apiVersion}/ managerdemands / {id} '

Как я могу иметь такие же шаблоны, как отличается имя контроллера?

1 Ответ

1 голос
/ 11 октября 2019

Проблема здесь в названии маршрута и не обязательно в шаблоне. Изменить название маршрута. Имена маршрутов должны быть уникальными во избежание конфликтов маршрутов.

//...
public class CustomerDemandController : ControllerBase
{
    private const string GetByIdOperation = "GetCustomerDemandById"; //<-- Unique

    [Get("{id}", Name = GetByIdOperation)]
    public async Task<ActionResult<CustomerDemandResponse>> GetAsync([FromRoute] string id)
            => await this.GetAsync(() => Service.GetByIdAsync(id),
                                   ConversionHelper.Convert);

    //...

Имена маршрутов могут использоваться для создания URL-адреса на основе определенного маршрута. Имена маршрутов не влияют на поведение маршрутизации при сопоставлении URL-адресов и используются только для генерации URL-адресов. Имена маршрутов должны быть уникальными для всего приложения.

упорная мина

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

...