0

「複雑な」オブジェクト(単純なコレクションプロパティで構成される)を返すメソッドを持つ単純な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 値を使用していますが、この戻り値の型に関しては、自動マッパーがタスクに対応していない可能性があります...よくわかりません。

4

2 に答える 2

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;

     ....
    }
于 2012-04-11T14:14:09.530 に答える
0

MediaCollection フィールドはシリアル化されていません。[DataMember] 属性をフィールドに追加する必要があります。

[DataContract]
    public class MediaCollection
    {
        [DataMember]
        public String id;
        [DataMember]
        public String title;
        [DataMember]
        public Enum itemType;
        [DataMember]
        public String artistId;
        ...etc...
    }
于 2012-04-11T14:15:31.500 に答える