WCF - 泛型类的DataMember的自定义名称

时间:2012-03-02 21:50:27

标签: json wcf generics rest datamember

我有一个现有的WCF REST / JSON服务,它返回不同类型数据的列表。我想在每个响应中添加一个代表修订号的属性。

说我有'汽车'课程

[DataContract]
public class Car {
    [DataMember]
    public String make;
    [DataMember]
    public String year;
}

目前/ cars /返回一系列Cars,如下所示

{ [ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

现在,我希望回复是

{ revision:"1234", cars:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ]}

如果我只有一类汽车,这是微不足道的,但我的服务有数百个简单实体,我希望每个人都返回修订属性和实体列表。我想我可以做以下的事情,我创建一个通用类来包装现有项目。

[DataContract]
public class VersionedItem<T> {
    String revision;
    T item;

    [DataMember]
    public String revision {
        get{}
        set{}
    }

    [DataMember]
    public T item {
        get{}
        set{}
    }
} 

除非我需要返回以下内容,否则这几乎可以正常工作:

{ revision:"1234", cars:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

这实际上是返回

{ revision:"1234", item:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

问题1:有没有办法专门化泛型类的实例来指定item属性的正确名称(在这种情况下是汽车)? IE,(总hogwash,但帮助得到重点)

public class VersionedCar : VersionedItem<Car>
{
    [DataMember(Name="cars")]
    public Car item{
        get{}
        set{}
    }
}

问题2:如果没有,最好的方法是实现包装所有响应并在所有响应中包含新属性?

1 个答案:

答案 0 :(得分:2)

您可以插入“操作格式化程序”。例如,使用Reflector,查看WebHttpBehavior如何插入并使用DataContractJsonSerializerOperationFormatter。

要做到这一点,首先需要插入自己的服务端点行为(类似于WebHttpBehavior。)当要求操作格式化程序行为时,将返回自己的自定义格式化程序(类似于DataContractJsonSerializerOperationFormatter._所有这些自定义格式化程序在委托其通常的序列化机制之前,序列化它通常序列化的数据的版本包装器。

您还需要在客户端返回类似的客户端行为和相同的格式化程序,以便可以在WCF客户端上处理此类消息。

希望这有帮助!