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

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