我在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配置中添加新路由,但不能修改现有路由。而且我不想影响现有的控制器。
我该如何解决这个问题?
答案 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);
}
}