2012-03-15 36 views
2

這是自託管的RESTful MVC4 Web API,唯一的路由是api/{controller}/{state}。當我發送一個具有body的HTTP-POST時,state參數爲空。如果我刪除身體狀態變量存在。當HTTP-POST有正文時,url參數爲空

我認爲它適用於HTTP-POST的方式是url參數被映射,然後身體被序列化爲額外的參數,在這種情況下是數據參數。內容只是字符串數據,我不得不寫一個自定義MediaTypeFormatter(我認爲它是奇怪的,它不能處理一個普通的字符串)。

這裏是我的控制器簽名

public class MyController : ApiController 
{ 
    public void Post(string state, string data) 
    { 
    } 
} 

有沒有人見過這種行爲之前,或者爲什麼具有主體目前是影響我的網址參數能向我解釋?

+0

那麼,我可以告訴你,在MVC3它的作品就像你期望的那樣。 – CrazyDart 2012-03-15 23:02:54

+1

目前有一些問題,當你有一些params來自身體和一些來自url。他們正在進行工作,並將在beta版後修復。我相信一個解決方法是使用[FromUrl]屬性。 – 2012-03-16 12:24:41

回答

1

一個解決辦法: 我試圖改變數據參數爲一個複雜類型(只是一個具有公共財產類),併發送內容爲文本/ XML,而不是純文本/和它的工作如預期。狀態參數不是空的,我有我的強類型的對象與數據。我想MVC希望得到的東西反序列化,如XML或JSON的HTTP請求的身體......

更多的研究: 我已經運行一些更多的測試機會。如果文章的正文是XML/JSON,它將首先嚐試將正文對象的屬性映射到方法參數,如下所示。如果仍然未映射的屬性,然後將剩餘的屬性相匹配,以在方法中的任強類型對象的屬性參數

PostMethod(string p1, string p2, myClass obj) // if myClass has a p3 property it will be mapped from the xml body. 
{ 
} 

// xml in body of http-post 
<Xml> 
    </p1> 
    </p2> 
    </p3> 
</Xml> 

如果所有的參數都沒有映射,那麼它會嘗試將URL參數映射。把它直接與我最初的問題聯繫起來。我現在看到的最好和最簡單的解決方案就是像這樣發送text/xml。

PostMethod(string state, string data) 
{ 
} 

<data>put data here</data> 

Urlencoded鍵/值對也工作得很好。

var r = client.PostAsync(url, new StringContent("data=Something", Encoding.UTF8, "application/x-www-form-urlencoded")); 

我最好的猜測是JSON和XML的鍵/值性質,FormEncoded幫助它映射到參數,所以這就是爲什麼它不象普通字符串。

這確實給了我一個頭痛的問題,我發現MVC4文檔相當稀少(它仍處於測試階段),但我希望這可以幫助其他可能有同樣問題的人。

相關問題