2013-08-05 158 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