Добавлен второй контроллер в мой WebAPI, и он не работает - PullRequest
0 голосов
/ 05 июля 2019

Добавлен второй контроллер в мой проект WebAPI, и он не работает полностью, но первый контроллер работает как положено

URI по умолчанию работает для первого контроллера, чтобы вернуть все записи: http://localhost:59654/api/TidalBatch

Второй контроллер не работает и возвращает соответствующую ошибку: http://localhost:59654/api/TidalBatchConsolidated

Однако, если я передаю {id} для него, он работает, когда я использую идентификатор (показанный пример): http://localhost:59654/api/TidalBatchConsolidated/BAM

Попытка изменения адресов маршрутизации

Конфигурация WebAPI: config.MapHttpAttributeRoutes ();

        config.Routes.MapHttpRoute(
            name: "TidalBatchApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "TidalBatchConsolidatedApi",
            routeTemplate: "api/TidalBatchConsolidated/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

У меня есть 2 контроллера, TidalBatchController.cs и TidalBatchConsolidatedController.cs.Оба наследуются от ApiController class.

Вот пример моего второго контроллера, который не работает должным образом:

 public class TidalBatchConsolidatedController : ApiController 
 {
   public TidalBatchConsolidated GetAll(string id) 
   { 
     using (BDW_ProcessingEntities_TidalBatch entities = new BDW_ProcessingEntities_TidalBatch()) 
     { 
       return entities.TidalBatchConsolidateds.FirstOrDefault(e => e.CompanyAbbr == id); 
     } 
   } 
 }

Когда я перехожу к базовому контроллеру по адресу, он должен возвращатьсяСписок выводит в формате JSON, в зависимости от того, в какую модель данных сущности передается.

1 Ответ

0 голосов
/ 05 июля 2019

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

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "TidalBatchConsolidatedApi",
    routeTemplate: "api/TidalBatchConsolidated/{id}",
    defaults: new { controller ="TidalBatchConsolidated", id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "TidalBatchApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Контроллер также должен убедиться, что есть соответствующее действие

Например

public class TidalBatchConsolidatedController: ApiController {

    [HttpGet]
    public IHttpActionResult Get() {
        //...
    }

    [HttpGet]
    public IHttpActionResult Get(string id) {
        //...
    }

}

Поскольку у вас включена маршрутизация атрибутов с помощью config.MapHttpAttributeRoutes();, вы можете отказаться от маршрута на основе соглашения и использовать вместо него маршрутизацию атрибутов на контроллере

[RoutePrefix("api/TidalBatchConsolidated")]
public class TidalBatchConsolidatedController: ApiController {

    //GET api/TidalBatchConsolidated
    [Route("")] //Default route
    [HttpGet]
    public IHttpActionResult GetAll() {
        //...
    }


    //GET api/TidalBatchConsolidated/BAM
    [Route("{id}")]
    [HttpGet]
    public IHttpActionResult Get(string id) {
        //...
    }

}

Ссылка Маршрутизация атрибутов в ASP.NET Web API 2

...