我现在有一个WCF托管的服务,它是自托管的,并且定义如下:
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, Method = "PUT", UriTemplate = "/device")]
void updateDeviceLevel(ZDevice device);
ZDevice类看起来像这样:
public class ZDevice {
public bool? newPowerState { get; set; }
public int nodeId {get; set;}
}
我有一个简单的Mac客户端,通过使用http帖子来使用该服务。它将{"newLevel":27,"nodeId":6}
发布到\devices
网址,而.NET会将值神奇地填充到ZDevice对象中。一切都很好。
然而,现在我需要添加一些基本的安全性。我通过在方法调用中添加一个新参数和一些“RequestWrapping”来完成此操作:
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.WrappedRequest, Method = "PUT", UriTemplate = "/device")]
void updateDeviceLevel(string password, ZDevice device);
我现在要做的是弄清楚服务器对消费客户端的期望语法。我希望在{"password":"somepwd", "newLevel":27,"nodeId":6}
中发布是可行的,但.NET不再能像以前那样“反序列化”到ZDevice对象中。
有人给我一些建议吗?
由于
答案 0 :(得分:3)
它应该是这样的:
{"password":"somepwd", "device": {"newLevel":27,"nodeId":6}}
JSON对象上的每个属性都有一个值;在device
的情况下,它只是一个新对象。
请注意,在ZDevice
课程中,您将其称为newPowerState
,但在JSON中,您将其称为newLevel
。在你的课堂上它也是一个bool,但是在JSON中你给它分配了一个int。有些东西不匹配。
根据您的C#,我希望它看起来像这样:
{"password":"somepwd", "device": {"newPowerState":true,"nodeId":6}}
JSON对象中的属性名称应与C#中的参数/属性名称匹配。