2014-01-16 76 views
4

我正在使用基於休息的wcf服務,該服務定義了一個我想要使用的操作。 BodyStyle的定義設置爲WebMessageBodyStyle.Wrapped。當BodyStyle = WebMessageBodyStyle.Wrapped時調用Rest C#的WCF服務操作

有人可以請建議如何我可以從服務使用.net讀取返回值,而無需更改服務器端?

當wcf rest操作將BodyStyle設置爲WebMessageBodyStyle.Wrapped時,可以將響應流轉換爲DataContractJsonSerialized函數中的序列化對象嗎?

以下是

[OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json,UriTemplate = "CheckStatus/{id}")] 
    CurrentStatus CheckStatus(string id); 

的CurrentStatus數據合同被定義爲

[DataContract] 
public class CurrentStatus 
{ 
    [DataMember(Name = "message")] 
    public string message { get; set; } 
    [DataMember(Name = "value")] 
    public int value { get; set; } 
} 

如果WebMessageBodyStyle設置爲裸露的,如以下代碼表示,則在WCF服務方法的定義通話按預期工作。如果將WebMessageBodyStyle設置爲包裝,則即使服務器使用期望值進行響應,消息和值數據成員也總是被讀取爲空白。這可以通過網絡瀏覽器調用。

我想修改這個使用代碼來讀取包裝器內的json內容。

[OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json,UriTemplate = "CheckStatus/{id}")] 
    CurrentStatus CheckStatus(string id); 

//Client code Works if server operation contarct BodyStyle=WebMessageBodyStyle.Wrapped 
string uri = "http://TestServer/WCF/WCF.svc/CheckStatus/{7}" 
byte[] data = proxy.DownloadData(uri); 
Stream stream = new MemoryStream(data); 
DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof (CurrentStatus)); 
CurrentStatus status = obj.ReadObject(stream) as CurrentStatus; 
Console.WriteLine(status.message); 
Console.WriteLine(status.value); 

當稱爲瀏覽器下面的內側的URI是樣品響應

如果BodyStyle是WebMessageBodyStyle.Bare樣品響應是

{"message":"New","value":1} 

當BodyStyle被WebMessageBodyStyle.Wrapped樣品迴應是

{"CheckStatusResult":{"message":"New","value":1}} 

在此先感謝

+0

先閱讀本文http://stackoverflow.com/questions/20206069/restful-web-service-body-format/20225936#20225936它提供了很多有用的細節。 – yyou

+0

謝謝。這是有用的信息。我在回覆後更新了我的問題。我試圖找出如何在BodyStyle = WebMessageBodyStyle.Wrapped時使用DataContractJsonSerializer對象從.net調用服務操作。這超出了這個問題的範圍。 – user3199045

回答

1

下面的工作?我還沒有測試過它。

public class CurrentStatusWrapper 
{ 
    public CurrentStatus CheckStatusResult {get; set;} 
} 

DataContractJsonSerializer obj = 
         new DataContractJsonSerializer(typeof (CurrentStatusWrapper));