2012-04-11 6 views
0

"간단한"및 "컬렉션 속성"으로 구성된 "복잡한"개체를 반환하는 간단한 WCF 서비스가 있습니다. 이 메서드를 호출하고 결과 XML을 보면 콜렉션의 항목에 값이 없습니다. 그러나 디버거에서 .net 개체를 검사하면 컬렉션 및 해당 값이 올바르게 채워집니다.WCF 서비스에서 반환 된 XML에서 컬렉션 항목 값이 누락되었습니다.

컬렉션을 포함하는 클래스 :


[DataContract] 
    public class MetadataResponse 
    { 
     [DataMember] 
     public int index; 
     [DataMember] 
     public int count; 
     [DataMember] 
     public int total; 
     [DataMember] 
     public MediaCollection[] mediaCollection; 
     [DataMember] 
     public MediaMetadata[] mediaMetadata; 
    } 

포함 된 항목 클래스 :


[DataContract] 
    public class MediaCollection 
    { 
     public String id; 
     public String title; 
     public Enum itemType; 
     public String artistId; 
     public String artist; 
     public String albumArtURI; 
     public Boolean canPlay; 
     public Boolean canEnumerate; 
     public Boolean canAddToFavorites; 
     public Boolean canScroll; 
     public Boolean canSkip; 
    } 

개체를 반환 방법 :


public MetadataResponse getMetadata(string id, int index, int count, bool recursive) 
     { 
      MetadataResponse metadataResponse = new MetadataResponse(); 
      MediaCollection mediaCollectionItem = new MediaCollection(); 

      // return a static collection for now 
      metadataResponse.index = 0; 
      metadataResponse.count = 3; 
      metadataResponse.total = 3; 
      metadataResponse.mediaCollection = new MediaCollection[3]; 

      // add some items 
      mediaCollectionItem.id = "0001"; 
      mediaCollectionItem.title = "foo"; 
      metadataResponse.mediaCollection[0] = mediaCollectionItem; 

      mediaCollectionItem.id = "0002"; 
      mediaCollectionItem.title = "bar"; 
      metadataResponse.mediaCollection[1] = mediaCollectionItem; 

      mediaCollectionItem.id = "0003"; 
      mediaCollectionItem.title = "choo"; 
      metadataResponse.mediaCollection[2] = mediaCollectionItem; 

      return metadataResponse; 
     } 

디버거 결과 채워진 개체를 검사 :

(210)

{MurfieSoapApi.MetadataResponse} 
    count: 3 
    index: 0 
    mediaCollection: {MurfieSoapApi.MediaCollection[3]} 
    mediaMetadata: null 
    total: 3 

메소드 호출에서 XML 결과는 (여전히 ... StackOverflow에이 일을 포맷하는 방법을 알아 내려고) :

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
     <getMetadataResponse xmlns="http://www.sonos.com/Services/1.1"> 
      <getMetadataResult xmlns:a="http://schemas.datacontract.org/2004/07/MurfieSoapApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <a:count>3</a:count> 
       <a:index>0</a:index> 
       <a:mediaCollection> 
        <a:MediaCollection /> 
        <a:MediaCollection /> 
        <a:MediaCollection /> 
       </a:mediaCollection> 
       <a:mediaMetadata i:nil="true" /> 
       <a:total>3</a:total> 
      </getMetadataResult> 
     </getMetadataResponse> 
    </s:Body> 
</s:Envelope> 

내가 대신 배열의 다른 컬렉션 형식을 시도했다 (목록, 등)하지만 결과는 항상 동일했습니다. 간단한 결과를 반환하는 다른 메서드에 대해서는 잘 작동하는 기본 web.config 값을 사용하고 있지만이 반환 형식에 대해서는 자동 매퍼가 작업에 적합하지 않을 수도 있습니다. 확실하지 않습니다.

답변

1

당신은 MediaCollection 클래스의

DataMember를

속성이 없기 때문에. 대신이의

:

[DataContract] 
    public class MediaCollection 
    { 
     public String id; 
     public String title; 
     public Enum itemType; 
     public String artistId; 
     public String artist; 
     public String albumArtURI; 
     public Boolean canPlay; 
     public Boolean canEnumerate; 
     public Boolean canAddToFavorites; 
     public Boolean canScroll; 
     public Boolean canSkip; 
    } 

당신이 작성해야이 :

[DataContract] 
    public class MediaCollection 
    { 
     [DataMember] 
     public String id; 

     [DataMember] 
     public String title; 

    .... 
    } 
+0

와우, 어떻게 알았지? :) 그러나, 내가 그것을 추가 할 때, 나는 WCF 테스트 클라이언트로 테스트 할 수 없다. (메서드에 빨간 x를 둔다.); 이것이 예상 되는가? – jasongullickson

+0

아마도 MediaCollection의 Enum 값 때문일 수 있습니다. 자세한 내용은 여기를 참조하십시오. http://msdn.microsoft.com/en-us/library/aa347875.aspx –

0

MediaCollection 필드는 직렬화되지 않습니다. [DataMember] 특성을 필드에 추가해야합니다.

[DataContract] 
    public class MediaCollection 
    { 
     [DataMember] 
     public String id; 
     [DataMember] 
     public String title; 
     [DataMember] 
     public Enum itemType; 
     [DataMember] 
     public String artistId; 
     ...etc... 
    } 
관련 문제