2013-04-04 24 views
4

我有一個情況我有以下兩種方法之一接受波蘇和我控制器類POCO的另一個列表:如何使用ASP.Net WebApi重載的方法?

[AcceptVerbs("PUT")] 
[ActionName("Item")] 
public void SaveItem([FromBody] Item item) 
{ 
    m_controller.SaveItem(item);   
} 

[AcceptVerbs("PUT")] 
[ActionName("Items")] 
public void SaveItems([FromBody] List<Item> items) 
{ 
    m_controller.SaveItem(items); 
} 

我的路由表看起來像:

routes.MapHttpRoute("Item Route", 
        "api/item/{orderId}", 
        new 
        { 
         controller = "MyOrder", 
         action = "Item", 
         orderId = RouteParameter.Optional 
        }); 

routes.MapHttpRoute("Items Route", 
        "api/items/{orderId}", 
        new 
        { 
         controller = "MyOrder", 
         action = "Items", 
         orderId = RouteParameter.Optional 
        }); 

可正常工作。但我想過重構代碼來嘗試重載。我試圖重載我的控制器中的方法,只有一個路由,但失敗了500錯誤 - 無效的請求。我認爲webapi將通過驗證參數來解析調用 - 如果它是一個列表,那麼它將調用帶有list作爲參數的重載方法,否則將調用其他方法。我正打算做這樣的事情:

[AcceptVerbs("PUT")] 
[ActionName("Item")] 
public void SaveItem([FromBody] Item item) 
{ 
    m_controller.SaveItem(item);   
} 

[AcceptVerbs("PUT")] 
[ActionName("Item")] 
public void SaveItem([FromBody] List<Item> items) 
{ 
    m_controller.SaveItem(items); 
} 

我的路由表看起來像:

routes.MapHttpRoute("Item Route", 
        "api/item/{orderId}", 
        new 
        { 
         controller = "MyOrder", 
         action = "Item", 
         orderId = RouteParameter.Optional 
        }); 
+0

你有什麼異常? – 2013-04-04 14:42:34

+0

我總是收到「500錯誤 - 無效請求」。沒什麼。 – 2013-04-04 14:58:03

+0

您是否遠程訪問? – 2013-04-04 15:00:04

回答

1

我懷疑是路由不會拿身體考慮。在你的情況下,確定使用哪個超載的唯一方法是適當地解析正文和路由。你可以做的一個簡化就是總是通過一種方法獲取Item的列表。然後在單個項目的情況下,只需將該項目包括在列表中。

+0

我同意,這就是我們爲另一個api所做的只有一個方法的列表。我想知道我是否可以有重載。 – 2013-04-04 15:14:07

2

Web API使用稱爲IHttpActionSelector的東西來確定在控制器中調用哪個動作。我認爲默認實現不支持像這樣的場景的重載。你可以實現一個自定義的IHttpActionSelector,但它可能需要很多工作。看看樣品在這個博客帖子,

http://www.novanet.no/blog/aanund-austrheim/dates/2012/7/several-post-methods-on-an-apicontroller-using-an-actionselector/

這將是更簡單,支持單一的方案,你總是收到的項目清單。對於一個項目的情況,這只是一個單一項目的列表。

+0

感謝您的鏈接..似乎多一點工作,但看起來像一個黑客攻擊。但很高興給一個想法。但我想,我應該簡單直接地使用一種方法來接受一個列表,正如Jim所建議的那樣,並且正如我們在另一個API中所做的那樣。 – 2013-04-04 15:17:05

+1

@PabloCibraro嗨,那個鏈接已經死了。 – 2015-04-14 10:31:29