2012-03-02 1 views
3

다른 유형의 데이터 목록을 반환하는 기존 WCF REST/JSON 서비스가 있습니다. 각 응답에 개정 번호를 나타내는 단일 속성을 추가하고 싶습니다. WCF - 일반 클래스의 DataMember에 대한 사용자 정의 이름

는 응답이있을 때까지 내가 좋아하는 것, 내가 지금 다음

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

처럼

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

가 현재/자동차/자동차의 배열을 반환하는 '자동차'클래스가 말

{ 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을 반환됩니다 인스턴스를 전문으로 할 수있는 방법이있다 항목 속성 (이 경우 자동차)의 올바른 이름을 지정하기 위해 일반 클래스의 IE (총 개판,하지만에 걸쳐 포인트를 얻을 수 있도록하기 위해)

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

질문 2 :이 아니라면, 뭐죠 모든 응답을 포장하고 모든 응답에 새로운 속성을 포함 달성하기 위해 가장 좋은 방법은?

답변

2

"작업 포맷터"를 연결할 수 있습니다. 예를 들어 Reflector를 사용하여 WebHttpBehavior가 플러그 인되고 DataContractJsonSerializerOperationFormatter를 사용하는 방법을 살펴보십시오.

이 작업을 수행하려면 먼저 WebHttpBehavior와 비슷한 고유 한 서비스 끝점 동작을 플러그인해야합니다. 동작에서 작업 포맷터를 요청하면 사용자 지정 형식화 기가 반환됩니다 (DataContractJsonSerializerOperationFormatter._와 유사 함). 사용자 정의 포맷터는 일반적인 직렬화 메커니즘에 위임하기 전에 정상적으로 직렬화하는 데이터 주위의 버전 래퍼를 직렬화합니다.

비슷한 클라이언트 동작 및 동일한 포맷터가 클라이언트 끝에 있어야하므로 WCF 클라이언트에서 메시지를 처리 ​​할 수 ​​있습니다.

희망이 있습니다!