3

我有一个现有的 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"} ]}

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

[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:有没有办法专门化一个泛型类的实例来为项目属性(在这种情况下是汽车)指定正确的名称?IE,(完全废话,但有助于理解这一点)

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

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

4

1 回答 1

2

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

为此,您首先需要插入您自己的服务端点行为(类似于 WebHttpBehavior。)当要求该行为提供操作格式化程序时,您将其返回您自己的自定义格式化程序(类似于 DataContractJsonSerializerOperationFormatter。在委托给通常的序列化机制之前,围绕它通常序列化的数据序列化一个版本包装器。

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

希望这可以帮助!

于 2012-04-26T18:56:34.457 回答