2013-08-05 201 views
2

我想使用log4javascript創建客戶端日誌記錄基礎結構。所有日誌都發送到服務器。這部分運作良好。我創建了WebApi控制器來在服務器上寫入這些日誌消息。請求如下:無法正確綁定視圖模型

Request Headers

我創建了以下視圖模型:

public class LogEntryViewModel 
{ 
    public string logger { get; set; } 
    public int timestamp { get; set; } 
    public string level { get; set; } 
    public string url { get; set; } 
    public string[] message { get; set; } 
} 

public class LoggerViewModel 
{ 
    public LogEntryViewModel data { get; set; } 
    public string layout { get; set; } 
} 

但問題是,在LogEntryViewModel所有數據都是默認的。即使當我將public LogEntryViewModel data更改爲public JObject data時,也會導致產生空的data對象。我試圖解析Json的請求包含,它是正確的。這裏可能會出現什麼問題?

編輯:

當我已經改變Content-Typeapplication/json;charset=UTF-8請求看起來方式如下:

Request #2

然後,我已經改變了郵政法的控制器:

// POST api/loggerservice 
    public void Post([FromBody]LogEntryViewModel log) 
    { 
     //BL 
    } 

但是,效果依然如此。

回答

3

在Web API中,媒體類型決定Web API如何序列化和反序列化HTTP消息主體。內置對XML,JSON和表單urlencoded數據的支持,您可以通過編寫媒體格式化程序來支持其他媒體類型。

我認爲,根據您的內容類型(X WWW的形式,進行了urlencoded),網絡API希望是這樣的:logger=AjaxLogger&timestamp=1375705087456...所以它可以使用窗體-urlencoded數據串行。

既然你發送JSON服務器我建議設置Content-Type應用/ JSON和使用JSON.stringify,因此它可以使用JSON序列化的模型綁定:

data: JSON.stringify({'logger':'AjaxLogger', 'timestamp': '1234568789'}) 

你可能想現在去除佈局屬性。

您不需要[FromBody]。這blogpost幫助我瞭解[FromBody]屬性

+0

感謝您的回答。但我也有'layout'字段作爲字符串發送。這不會導致問題嗎? – seeker

+0

不要這麼認爲,看我更新的回答 –

+0

請看我更新的問題。我必須錯過一些東西,但無法弄清楚什麼 – seeker