C# WCF-Rest-DataContract:反序列化XML包装的响应
假设我们使用的是返回xml的REST WCF服务 是否可以“自动”反序列化对DataContract的xml包装响应 简单示例 类别:C# WCF-Rest-DataContract:反序列化XML包装的响应,c#,xml,rest,wcf,deserialization,C#,Xml,Rest,Wcf,Deserialization,假设我们使用的是返回xml的REST WCF服务 是否可以“自动”反序列化对DataContract的xml包装响应 简单示例 类别: [DataContract] public class TestClass { [DataMember] string StringValue { get; set; } [DataMember] int IntValue { get; set; } } 服务: [OperationContract] [WebGet(UriTe
[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);
}
}
//在或示例中使用T作为TestClass。
公共静态T反序列化(字符串xml)
{
使用(Stream=newmemoryStream())
{
byte[]data=System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(数据,0,数据长度);
流位置=0;
DataContractSerializer反序列化程序=
新的DataContractSerializer(typeof(T));
return(T)反序列化器。ReadObject(stream);
}
}
此代码适用于裸响应
由于webClient只返回完整的请求,所以输出xml包含包装器元素,DataContractSerializer尝试解析一个简单的字符串,而不是来自WCF包装的响应(应该“忘记”包装器)
目标是构造一个包装样式(裸包装/包装)无关紧要的客户机。为什么不将输出反序列化为一个简单的XML?大概是这样的:
public static T XmlDeserializer<T>(string xmlString)
{
var instance = default(T);
var xmlSerializer = new XmlSerializer(typeof(T));
using (var stringreader = new StringReader(xmlString))
instance = (T)xmlSerializer.Deserialize(stringreader);
return instance;
}
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]
抱歉,但我的主要目标也有同样的问题:使用包装和裸响应。亲爱的@Manea。请张贴整个答复,以便我可以帮助你。谢谢。请看我示例中的服务:当它设置为BodyStyle=WebMessageBodyStyle.Wrapped时,返回的xml是“Wrapped”,因此反序列化不起作用。我正在寻找一种方法来反序列化WCF生成的Xml,这种方法应该适用于WebMessageBodyStyle.Wrapped和WebMessageBodyStyle.Bare.dear@Manea。问题不在于系列化方法。这是关于输出类的。当您更改BodyStyle时。包装您的输出将发生更改。我不知道您是如何使用web服务的,但是如果您能够捕获输出,您将了解问题所在。