WCF为REST包装变量复杂类型

时间:2010-07-01 12:12:57

标签: wcf api serialization rest response

我正在实现一个lo-REST API并希望返回XML或JSON。在.NET WCF中构建它。

我喜欢Flickr和Last FM API的设计,它们将变量复杂类型包装在一个简单的响应中:

<lfm status="ok">
  <user>
    <name>RJ</name>
    <realname>Richard Jones </realname>
    <country>UK</country>
    <age>27</age>
  </user>
</lfm>

<lfm status="ok">
  <track>
    <name>Best track ever</name>
    <album>Thriller</album>
  </user>
</lfm>

<lfm status="fail">
  ... error details
</lfm>

复杂类型的序列化很简单,正如您所期望的那样(使用DataContract,DataMember等)。但是由于可能包含在内部的可变复杂类型,将它包装在某种自定义响应中会让我感到沮丧。给响应提供由复杂类型填充的类型对象的成员不会序列化:

[DataContract]
public class Response
{
    public enum ResponseStatus
    {
        ok,
        fail
    }

    [DataMember]
    public ResponseStatus Status { get; set; }

    [DataMember]
    public object Data { get; set; }

}

非常感谢任何想法或帮助。

非常感谢, 亚历

修改 蒂姆罗伯茨提供了一个有趣的解决方案,虽然它没有很好地序列化。一个选项是将所有可能的复杂类型作为属性指定[DataMember(EmitDefaultValue = false)],因此空值不会序列化。不确定这是最好的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以在Data中为Response类型定义类层次结构:

如,

[DataContract]
public abstract class Data
{ }

[DataContract]
public class FooData : Data
{ }

[DataContract]
public class BarData : Data
{ }

然后在Response类上指出已知类型:

[DataContract]
[KnownType(typeof(FooData))]
[KnownType(typeof(BarData))]
public class Response
{
    public enum ResponseStatus
    {
        ok,
        fail
    }

    [DataMember]
    public ResponseStatus Status { get; set; }

    [DataMember]
    public Data Data { get; set; }
}