【发布时间】:2017-06-10 14:02:05
【问题描述】:
假设我们正在使用返回 xml 的 REST WCF 服务。
是否可以“自动”反序列化对 DataContract 的 xml 包装响应?
简单示例
类:
[DataContract]
public class TestClass
{
[DataMember]
string StringValue { get; set; }
[DataMember]
int IntValue { get; set; }
}
服务:
[OperationContract]
[WebGet(UriTemplate = "Test",
BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
TestClass Test();
客户:
using (WebClient webClient = new WebClient())
{
webClient.Headers["Content-type"] = "application/xml";
webClient.Encoding = Encoding.UTF8;
return webClient.DownloadString($"{BASE_URL}/Test");
}
反序列化:
// With T as TestClass in or example.
public static T Deserialize<T>(string xml)
{
using (Stream stream = new MemoryStream())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(data, 0, data.Length);
stream.Position = 0;
DataContractSerializer deserializer =
new DataContractSerializer(typeof(T));
return (T)deserializer.ReadObject(stream);
}
}
此代码适用于裸响应。
由于 webClient 只返回完整的请求,输出 xml 包含三个包装器元素,并且 DataContractSerializer 尝试解析一个简单的字符串,现在不要来自 WCF 包装的响应(并且应该“忘记”包装器)。
目标是构建一个包装样式(裸/包装)无关紧要的客户端。
【问题讨论】:
标签: c# xml rest wcf deserialization