我现在有一个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 post来使用服务。它将{"newLevel":27,"nodeId":6}
发布到devices
url,.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对象中。
有人给我提些建议吗?
感谢
它应该是这样的:
{"password":"somepwd", "device": {"newLevel":27,"nodeId":6}}
JSON对象上的每个属性都有一个值;而在CCD_ 4的情况下,它只是一个新对象。
请注意,在ZDevice
类中,您称之为newPowerState
,但在JSON中,您将其称为newLevel
。在你的类中,它也是一个bool,但在JSON中,你给它分配了一个int。有些东西不匹配。
基于你的C#,我希望它看起来像这样:
{"password":"somepwd", "device": {"newPowerState":true,"nodeId":6}}
JSON对象中的属性名称应该与C#中的参数/属性名称匹配。