我的WCF服务对请求数据的期望是什么样的?

时间:2011-07-01 14:04:00

标签: wcf c#-4.0

我现在有一个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对象中。

有人给我一些建议吗?

由于

1 个答案:

答案 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#中的参数/属性名称匹配。