我有一个现有的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:如果没有,最好的方法是实现包装所有响应并在所有响应中包含新属性?
答案 0 :(得分:2)
您可以插入“操作格式化程序”。例如,使用Reflector,查看WebHttpBehavior如何插入并使用DataContractJsonSerializerOperationFormatter。
要做到这一点,首先需要插入自己的服务端点行为(类似于WebHttpBehavior。)当要求操作格式化程序行为时,将返回自己的自定义格式化程序(类似于DataContractJsonSerializerOperationFormatter._所有这些自定义格式化程序在委托其通常的序列化机制之前,序列化它通常序列化的数据的版本包装器。
您还需要在客户端返回类似的客户端行为和相同的格式化程序,以便可以在WCF客户端上处理此类消息。
希望这有帮助!