我想使用log4javascript创建客户端日志记录基础结构。所有日志都发送到服务器。那部分效果很好。我创建了WebApi控制器来在服务器上写入这些日志消息。请求如下:
我创建了以下视图模型:
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-Type
更改为application/json;charset=UTF-8
时,请求按以下方式查看:
然后我在控制器上更改了Post方法:
// POST api/loggerservice
public void Post([FromBody]LogEntryViewModel log)
{
//BL
}
然而,效果仍然相同。
答案 0 :(得分:3)
在Web API中,媒体类型确定Web API如何序列化和反序列化HTTP消息正文。内置对XML,JSON和表单 - urlencoded数据的支持,您可以通过编写媒体格式化程序来支持其他媒体类型。
我认为,根据您的内容类型(x-www-form-urlencoded),Web Api需要类似于logger=AjaxLogger×tamp=1375705087456...
的内容,因此它可以将序列化程序用于表单urlencoded数据。
由于您要将JSON发送到服务器,我建议将Content-Type
设置为 application / json 并使用JSON.stringify
,以便它可以将JSON序列化程序用于模型结合:
data: JSON.stringify({'logger':'AjaxLogger', 'timestamp': '1234568789'})
您可能现在也想删除布局属性。
您不需要[FromBody]
。这个blogpost帮助我理解了[FromBody]
属性