2012-11-01 23 views
3

假設ApiController具有多個參數的操作:行程多複雜的參數ASP.NET的WebAPI

[HttpPost] 
public void AddAddress(Person person, Address address, int simple) 

或類似的東西。 現在我嘗試發送與內容類型application/json和JSON這樣的POST請求:

{ 
    person: {...}, address: {..}, simple: 1 
} 

只是假設它是有效的JSON)

或JSON數組是這樣的: [person, address, simple]

但WebApi不會識別這個,並告訴我它找不到該動作,因爲它不支持json請求中的多個參數。

我正在從使用HttpClient的C#客戶端執行此操作,我們希望使用json執行發佈請求。我想使用WebApi.Client包,它爲HttpClient提供了幾個有用的擴展,但我們有一個可移植的庫項目(webapi客戶端不支持)。

我將如何去支持此功能?

我試圖使用自定義的ActionFilter,它永遠不會運行,因爲它無法預先找到操作。我嘗試了MediaTypeFormatter,它不知道上下文和參數,還嘗試了ModelBinder,它似乎只在每個參數的基礎上,並不總是得到執行。

謝謝!

回答

4

帶格式化程序的ASP.NET Web API中的內置參數綁定策略僅支持映射到請求主體的單個複雜參數。就你而言,你試圖映射至少兩個複雜的參數。不延長這一基礎設施的最簡單的解決方案是創建一個包含這些參數作爲屬性

public class AddressModel 
{ 
    public Person Person { get; set; } 
    public Address Address { get; set; } 
    public int Simple { get; set; } 
} 

,並使用該模型在控制器動作

public void AddAddress(AddressModel model); 
+0

這會是常見的解決方案的新模式類,雖然在我們的特例中,這意味着我們必須在運行時生成這個模型類(ApiController在DynamicAssembly中)。我想我可以使用JObject或其他東西,但是我們會放棄驗證功能。所以我認爲我們需要真正支持多個複雜的論點。 –

+1

如果是這種情況,您可能需要查看此博客文章,瞭解如何擴展Web API以支持該行爲。 http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx –

+0

謝謝,我們決定爲自定義的方法生成一個重載模型作爲單一的參數,因爲另一個解決方案會與json序列化和東西有很大的關係。 –