如何使用注释覆盖相同方法的web api路由

时间:2017-02-23 19:31:31

标签: c# web-services rest asp.net-web-api2 asp.net-web-api-routing

我在HttpConfiguration

中有这个配置
config.Routes.MapHttpRoute("Default", "api/{controller}");
config.Routes.MapHttpRoute("Another", "api/{controller}/{action}");
config.Routes.MapHttpRoute("WithKey", "api/{controller}/{action}/{key}");

因此我无法像这样访问我的控制器

http://<host>/api/products (works)
http://<host>/api/products/1 (doesn't work)

所以我在get方法中添加了注释Route但它没有工作

[RoutePrefix("products")]
public class ProductsController : ApiController
{

    [HttpGet]
    public IQueryable<IProduct> GetProducts()
    {
        return db.GetProducts();
    }

    //[Route("products/{productID}")] Tried. Doesn't work
    //[Route("{productID:int}")] Tried. Doesn't work
    [HttpGet]
    public IProduct GetProduct(int productID)
    {
        return db.GetProduct(productID);
    }
}

使其成功的唯一方法是输入此http://<host>/api/products?productID=1这样的地址,但我真的想要使用此网址http://<host>/api/products/1进行访问。

我可以在http配置中添加新路由,但不能修改现有路由。而且我不想影响现有的控制器。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

首先确保在基于约定的路由之前启用属性路由。

config.MapHttpAttributeRoutes();
//...convention-based routes.
config.Routes.MapHttpRoute("Default", "api/{controller}");
//...other code removed for brevity

接下来,您要更新属性路由。

[RoutePrefix("api/products")]
public class ProductsController : ApiController {
    //GET api/products
    [HttpGet]
    [Route("")]
    public IQueryable<IProduct> GetProducts() {
        return db.GetProducts();
    }    

    //GET api/products/1
    [HttpGet]
    [Route("{productID:int}")]
    public IProduct GetProduct(int productID) {
        return db.GetProduct(productID);
    }
}