WCF -Rest- DataContract:反序列化 XML 包装的响应

Posted

技术标签:

【中文标题】WCF -Rest- DataContract:反序列化 XML 包装的响应【英文标题】:WCF -Rest- DataContract : Deserialize XML wrapped response 【发布时间】: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 包装的响应(并且应该“忘记”包装器)。

目标是构建一个包装样式(裸/包装)无关紧要的客户端。

【问题讨论】:

【参考方案1】:

为什么不将输出反序列化为简单的 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;

注意:由于默认的 xmlns 标签,您应该在客户端类中使用命名空间,如下所示:

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]

【讨论】:

抱歉,但我的主要目标是同样的问题:处理包装和裸露的响应。 亲爱的@Manea。请发布整个回复,以便我可以帮助您。谢谢。 请查看我的示例中的 service:当它设置为 BodyStyle = WebMessageBodyStyle.Wrapped 时,返回的 xml 被“包装”,因此反序列化不起作用。我正在寻找一种反序列化 WCF 生成的 Xml 的方法,该方法应该适用于 WebMessageBodyStyle.Wrapped AND WebMessageBodyStyle.Bare。 亲爱的@Manea。问题不在于序列化方法。它与您的输出类有关。当您更改 BodyStyle.Wrapped 您的输出更改。我不知道你是如何使用网络服务的,但如果你能捕获输出,你就会明白问题所在。

以上是关于WCF -Rest- DataContract:反序列化 XML 包装的响应的主要内容,如果未能解决你的问题,请参考以下文章

WCF反序列化如何在不调用构造函数的情况下实例化对象?

C# Restful WCF 服务。无法在帖子正文中反序列化 XML

WCF 中的 DataContract 有啥意义?

WCF:MessageContract、DataContract ... 感到困惑?

在 WCF 中命名通用 DataContract

WCF DataContract 与普通类 [重复]