Json Wrapped对象Post总是为null

时间:2013-11-26 20:07:29

标签: c# json wcf

[已编辑的消息包含更多信息和提琴手请求]

我试图调用一个像这样定义的Post webmethod服务器端:

[OperationContract]
[WebInvoke(Method = "POST", 
           RequestFormat = WebMessageFormat.Json, 
           ResponseFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.WrappedRequest, 
           UriTemplate = "SaveMessage")]
void SaveMessage(Message msg);

Message类定义如下:

public class Message
{
    public int Id { get; set; }
    public int FromId { get; set; }
    public int ToId { get; set; }
    public string Subject { get; set; }
    public string From { get; set; }
    public string To { get; set; }
    public DateTime DateTime { get; set; }
    public string Msg { get; set;}
    public bool IsRead { get; set; }
}

使用以下请求(已包装):

POST http://192.168.2.40:9001/AFMServer/SaveMessage HTTP/1.1
Content-Type: application/json
Host: 192.168.2.40:9001
Content-Length: 204
Expect: 100-continue
Connection: Keep-Alive
{
  "msg": {
    "Id": 0,
    "FromId": 0,
    "ToId": 0,
    "Subject": null,
    "From": "",
    "To": null,
    "DateTime": "0001-01-01T00:00:00",
    "Msg": null,
    "IsRead": false
  }
}

请求是 NOT 收到的服务器端,尽管它是按WebInvoke属性的指定包装的。

以下(裸)请求:

POST http://192.168.2.40:9001/AFMServer/SaveMessage HTTP/1.1
Content-Type: application/json
Host: 192.168.2.40:9001
Content-Length: 169
Expect: 100-continue
Connection: Keep-Alive
{
  "Id": 0,
  "FromId": 0,
  "ToId": 0,
  "Subject": null,
  "From": "",
  "To": null,
  "DateTime": "0001-01-01T00:00:00",
  "Msg": null,
  "IsRead": false
}

收到但是msg为空(这是有道理的,我猜,因为json没有被包装)。 有人可以帮我找出第一个请求不成功的原因吗?

谢谢!

注意:我正在使用 Json.Net

[编辑2] 如果我从Message类中删除DateTime字段,它就可以了!仍在试图找出原因

[编辑3] 解决方法写在下面作为答案 - HTH! : - )

2 个答案:

答案 0 :(得分:0)

假设您的Message类看起来像这样:

public class Message
{
  public int Id { get; set; }
  public int FromId { get; set; }
  public int ToId { get; set; }
  public string Subject { get; set; }
  public string From { get; set; }
  public string To { get; set; }
  public DateTime DateTime { get; set; }
  public string Msg { get; set; }
  public bool IsRead { get; set; }
}

然后让你的JSON看起来像这样:

{
    "Id": 0,
    "FromId": 0,
    "ToId": 0,
    "Subject": null,
    "From": "",
    "To": null,
    "DateTime": "0001-01-01T00:00:00",
    "Msg": null,
    "IsRead": false
}

应该映射到你的C#类就好了。

要记住的重要一点是,JSON的每个属性都应映射到C#对象上的属性(区分大小写)。

您的JSON将映射到如下所示的对象:

public class MyClass
{
  public Message Msg { get; set; }
}

答案 1 :(得分:0)

好吧,看起来(正如你们大多数人已经知道的那样),JSON对于日期格式非常繁琐。 由于我不想覆盖Serializer以符合JSON日期格式,因此我使用以下方法将日期作为字符串传递:

public class Message
{
    (...)

    public DateTime DateTime { get { return DateTime.Parse(DateTimeStr); } }
    public String DateTimeStr { get; set; }

    (...)
}