【问题标题】:WCF - Custom name for a DataMember of a generic classWCF - 泛型类的 DataMember 的自定义名称
【发布时间】:2012-03-02 21:50:27
【问题描述】:

我有一个现有的 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:如果没有,实现包装所有响应并在所有响应中包含新属性的最佳方法是什么?

【问题讨论】:

    标签: json wcf generics rest datamember


    【解决方案1】:

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

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多