2012-04-11 66 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; 
     } 

調試結果檢查所填充的對象:


{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類

數據成員

屬性。

取而代之的是:

[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 2012-04-11 14:33:29

+0

這可能是因爲MediaCollection中的枚舉值。請閱讀更多信息:http://msdn.microsoft.com/en-us/library/aa347875.aspx – 2012-04-11 14:59:51

0

的MediaCollection字段不被序列化。您需要將[DataMember]屬性添加到您的字段。

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