从 WCF 服务返回的 XML 中缺少集合项值

本文关键字:集合 XML WCF 服务 返回 | 更新日期: 2023-09-27 18:30:49

我有一个简单的WCF服务,它有一个返回"复杂"对象(由简单和集合属性组成)的方法。 当我调用此方法并查看生成的 XML 时,集合中的项缺少值;但是,如果我检查调试器中的 .NET 对象,则集合及其值将正确填充。

包含集合的类:


[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>

我尝试了其他集合类型而不是数组(List等),但结果总是相同的。 我正在使用默认的 web.config 值,该值适用于返回简单结果的其他方法,但当涉及到此返回类型时,自动映射器可能无法胜任任务......不确定。

从 WCF 服务返回的 XML 中缺少集合项值

因为你错过了

数据成员

类中的属性。

取而代之的是:

[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;
     ....
    }

MediaCollection 字段未序列化。 您需要将 [数据成员] 属性添加到字段中。

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