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

Posted

技术标签:

【中文标题】当 BodyStyle = WebMessageBodyStyle.Wrapped 时从 C# 调用 Rest WCF 服务操作【英文标题】:Calling Rest WCF Service operation from C# when BodyStyle = WebMessageBodyStyle.Wrapped 【发布时间】:2014-02-04 17:53:51 【问题描述】:

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

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

当 wcf 休息操作将 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

提前致谢

【问题讨论】:

先阅读这个***.com/questions/20206069/…它提供了很多有用的细节。 谢谢。这是有用的信息。在您回复后,我已经更新了我的问题。我试图找出当 BodyStyle=WebMessageBodyStyle.Wrapped 时如何使用 DataContractJsonSerializer 对象从 .net 调用服务操作。这超出了该问题的范围。 【参考方案1】:

下面的那个能用吗?我还没有测试过。

public class CurrentStatusWrapper 

    public CurrentStatus CheckStatusResult get; set;


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

【讨论】:

以上是关于当 BodyStyle = WebMessageBodyStyle.Wrapped 时从 C# 调用 Rest WCF 服务操作的主要内容,如果未能解决你的问题,请参考以下文章

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

禁用滚动条

删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped

使用 IPWorks nSoftware 的 Json 反序列化 BodyStyle Wrap 问题

H5 刮图-刮一刮

网页代码常用小技巧1