2

我想使用 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 datapublic JObject data那个会导致空data对象。我试图解析请求包含的 Json,它是正确的。这里可能有什么问题?

编辑:

当我更改Content-Typeapplication/json;charset=UTF-8请求时,如下所示:

请求 #2

然后我改变了控制器上的 Post 方法:

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

不过,效果还是一样的。

4

1 回答 1

3

在 Web API 中,媒体类型决定了 Web API 如何序列化和反序列化 HTTP 消息体。内置支持 XML、JSON 和 form-urlencoded 数据,您可以通过编写媒体格式化程序来支持其他媒体类型。

我认为,根据您的内容类型(x-www-form-urlencoded),Web Api 期望类似:logger=AjaxLogger&timestamp=1375705087456...因此它可以将序列化程序用于 form-urlencoded 数据。

由于您要将 JSON 发送到服务器,我建议将其设置Content-Typeapplication/json并使用JSON.stringify,以便它可以使用 JSON 序列化程序进行模型绑定:

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

您现在可能还想删除 layout 属性。

你不需要[FromBody]. 这篇文帮助我理解了[FromBody]属性

于 2013-08-05T12:49:46.873 回答