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

时间:2017-01-25 11:43:45

标签: c# xml rest wcf deserialization

假设我们正在使用REST WCF服务返回xml。

是否可以“自动”反序列化对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包含thre包装元素,而DataContractSerializer尝试解析一个简单的字符串,现在不要来自WCF包装的响应(并且应该“忘记”包装器)。

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

1 个答案:

答案 0 :(得分:0)

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