当BodyStyle = WebMessageBodyStyle.Wrapped时,从C#调用Rest WCF服务操作

时间:2014-01-16 00:46:57

标签: c# wcf rest web

我正在使用基于休息的wcf服务,该服务具有我想要使用的操作。 BodyStyle的定义设置为WebMessageBodyStyle.Wrapped。

有人可以建议我如何在不进行服务器端更改的情况下使用.net读取服务的返回值吗?

当wcf rest操作将BodyStyle设置为WebMessageBodyStyle.Wrapped时,我可以将响应流从DataContractJsonSerialized函数转换为序列化对象吗?

以下是wcf服务方法的定义

[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设置为Bare,则如下面的代码所示,则调用按预期工作。如果将WebMessageBodyStyle设置为wrapped,则即使服务器使用预期值进行响应,也始终将消息和值数据名称空白。通过网络浏览器调用可以看到这一点。

我正在尝试修改此消费代码以读取包装器中的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}}

提前致谢

1 个答案:

答案 0 :(得分:1)

下面的那个会工作吗?我没有测试过。

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

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