当BodyStyle=WebMessageBodyStyle时,从C#调用Rest WCF服务操作.包装好了



我使用的是一个基于rest的wcf服务,该服务定义了一个我想要使用的操作。BodyStyle的定义设置为WebMessageBodyStyle。包装好了。

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

当wcf rest操作将BodyStyle设置为WebMessageBodyStyles时,我可以从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设置为包装,则即使服务器使用预期值进行响应,消息和值数据成员也始终读取为空。这可以通过网络浏览器调用来实现。

我正在尝试修改这个消耗代码,以读取包装器中的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。裸样本响应为

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

当BodyStyle为WebMessageBodyStyle。包装的样本响应是

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

提前感谢

下面的一个能工作吗?我还没有测试过。

public class CurrentStatusWrapper 
{
public CurrentStatus CheckStatusResult {get; set;}
}
DataContractJsonSerializer obj = 
new DataContractJsonSerializer(typeof (CurrentStatusWrapper));

最新更新