1

我有这个配置在HttpConfiguration如何覆盖与注解

config.Routes.MapHttpRoute("Default", "api/{controller}"); 
config.Routes.MapHttpRoute("Another", "api/{controller}/{action}"); 
config.Routes.MapHttpRoute("WithKey", "api/{controller}/{action}/{key}"); 

由于这个原因,同样的方法网页API路线我无法访问我的控制器这样

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

所以我增加了注释路由在get方法但它不起作用

[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

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

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); 
    } 
} 
+0

感谢您的回答。我应用了MapHttpAttributRoutes()。然后我添加了注释。我只能请求GetProducts,但我仍然无法获取api/products/1。我收到的消息:“{”Message“:”没有找到与请求URI匹配的HTTP资源'http:// /api/products/1'.","MessageDetail":"没有在控制器上找到操作'产品'匹配请求。“}” –

+0

@MaximusDecimus,你有没有在基于会议的路线之前添加它,如在回答中建议的? – Nkosi

+0

是的,我做了同样的回答 –