[已编辑的消息包含更多信息和提琴手请求]
我试图调用一个像这样定义的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! : - )
答案 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; }
(...)
}