我正在使用基于rest的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}}
提前致谢
最佳答案
下一个会工作吗?我还没有测试。
public class CurrentStatusWrapper
{
public CurrentStatus CheckStatusResult {get; set;}
}
DataContractJsonSerializer obj =
new DataContractJsonSerializer(typeof (CurrentStatusWrapper));