2011-07-01 49 views
1

我有現在一個WCF託管服務,這是自託管和定義如下:我的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對象中。

有人對我有一些建議嗎?

感謝

回答

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#中的參數/屬性名的屬性名稱。

+0

DOH!我以爲我曾嘗試過,但我做了「zdevice」而不是「設備」。謝謝! – bugfixr

+0

另外感謝 - 我在創建我的問題時混淆了一些代碼。無需花時間查看,即可快速爲我發佈信息。 – bugfixr