WebAPI, как указать, какой маршрут будет достигнут контроллером

Я экспериментировал с MVC WebAPI, довольно крутая штука. Но я борюсь с концепцией маршрутов.

в качестве примера у меня есть структура проекта webAPI, примерно следующая:

Проект:

  • Controllers
    • Customers
      • CustomerController.cs
      • CustomerAddressController.cs
    • Products
      • ProductCategoriesController.cs
      • ПродуктыКонтроллер

В настоящее время у меня есть один маршрут API, определенный в WebApiConfig.cs

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

Это работало нормально, когда у меня были только контроллеры, связанные с клиентом. поэтому я мог бы позвонить:

  • ПОЛУЧИТЬ api/customer/CustomerAddress/?customerID= 1234

но теперь, когда я добавил контроллеры, связанные с продуктом, я нашел конфигурацию как есть (конечно), чтобы получить продукты, которые я должен вызывать Uri:

  • ПОЛУЧИТЬ api/customer/products/?prodID= 5678 *НО мне не нужен этот Uri

вместо этого я хочу:

  • ПОЛУЧИТЬ API/продукты/?prodID= 5678

и для категорий продуктов я хотел бы что-то вроде:

  • ПОЛУЧИТЬ API/продукты/категории/?catID= 1357

Я думал, что мне нужно добавить больше маршрутов, но я не могу найти, как связать различные контроллеры с маршрутом, который я хочу для них?

если я добавлю еще один маршрут, я получу два разных маршрута uri для каждого из созданных мной контроллеров.

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


person John    schedule 24.10.2013    source источник


Ответы (1)


С помощью Web Api 2 вы можете легко определить конкретную маршрутизацию для своих действий. Например :

public class CustomerController : ApiController
{
    [Route("api/customer")]
    public IEnumerable<Customer> GetCustomers()
    {
        // ..
    }

    [Route("api/customer/{customerID}")]
    public Customer GetCustomer(int customerID)
    {
        // ..
    }

    [Route("api/customer/CustomerAddresses/{customerID}")]
    public Address GetCustomerAddresses(int customerID)
    {
        // ...
    }
}

public class ProductController : ApiController
{
    [Route("api/product")]
    public IEnumerable<Product> GetProducts()
    {
        // ..
    }

    [Route("api/product/{prodID}")]
    public Product GetProduct(int prodID)
    {
        // ..
    }

    [Route("api/product/categories/{catID}")]
    public Category GetCategory(int catID)
    {
        // ...
    }
}
person Réda Mattar    schedule 24.10.2013
comment
Идеально: я читал, что WebAPI удалил декорирование методов, и если это правда, я рад, что он вернулся. Спасибо за этот ответ. - person John; 24.10.2013