2012-04-11 54 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... 
    }