Asp.net mvc 4 WebAPI如何指定到达控制器的路径

Asp.net mvc 4 WebAPI如何指定到达控制器的路径,asp.net-mvc-4,asp.net-web-api,asp.net-web-api-routing,Asp.net Mvc 4,Asp.net Web Api,Asp.net Web Api Routing,我一直在试验MVC WebAPI,非常酷的东西。但我正在为路线的概念而挣扎 例如,我有一个webAPI项目结构,如下所示: 项目: 控制器 顾客 CustomerController.cs CustomerAddressController.cs 产品 ProductCategoriesController.cs 产品控制器 目前,我在WebApiConfig.cs中定义了一个API路由 config.Routes.MapHttpRoute(

我一直在试验MVC WebAPI,非常酷的东西。但我正在为路线的概念而挣扎

例如,我有一个webAPI项目结构,如下所示:

项目:

  • 控制器
    • 顾客
      • CustomerController.cs
      • CustomerAddressController.cs
    • 产品
      • ProductCategoriesController.cs
      • 产品控制器
目前,我在WebApiConfig.cs中定义了一个API路由

        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/products/?prodID=5678
对于产品类别,我希望类似于:

  • 获取api/产品/类别/?catID=1357
我以为我要做的是添加更多的路线,但我找不到如何将各种控制器与我希望的路线关联起来

如果我添加了另一个路由,那么我最终会得到两个不同uri的路由到我构建的每个控制器


如何实现所需的逻辑分区?

使用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)
    {
        // ...
    }
}
公共类CustomerController:ApicController
{
[路线(“api/客户”)]
公共IEnumerable GetCustomers()
{
// ..
}
[路由(“api/customer/{customerID}”)]
公共客户GetCustomer(int customerID)
{
// ..
}
[路由(“api/customer/CustomerAddresses/{customerID}”)]
公共地址GetCustomerAddresses(int customerID)
{
// ...
}
}
公共类ProductController:ApicController
{
[路线(“原料药/产品”)]
公共IEnumerable GetProducts()
{
// ..
}
[路由(“api/product/{prodID}”)]
公共产品GetProduct(int prodID)
{
// ..
}
[路线(“api/product/categories/{catID}”)]
公共类别GetCategory(int catID)
{
// ...
}
}

Perfect:我一直在读WebAPI删除了方法装饰,如果这是真的,我很高兴看到它回来了。谢谢你的回答。