1

WCF の CollectionDataContract を使用しようとするローカルでホストされている WCF サービスがあります。

サービス契約は次のようになります。

[OperationContract]
GetSalesDeliveryNotesResponse GetSalesDeliveryNotes(GetSalesDeliveryNotesRequest request);

GetSalesDeliveryNotesResponse クラスには、次のようなプロパティ Serials があります。

[DataMember]
public SerialList Serials { get; set; }

SerialList クラスは GetSalesDeliveryNotesResponse の内部クラスであり、次のようになります。

[CollectionDataContract(ItemName = "Serial")]
public class SerialList : List<string> {
    public SerialList() : base() { }

    public SerialList(List<string> l) : base() {
        AddRange(l);
    }
}

このプロパティを設定するために使用するコードは次のようになります。

Serials = new GetSalesDeliveryNotesResponse.DeliveryNote.Order.Orderline.SerialList(
    (from s in r.Descendants("Serial") 
    select s.Value).ToList()
)

ここで、r は XElements のコレクションです (サービスは Oracle データベースに接続し、サービスがクライアントにシリアル化する必要がある XML を返すストアド プロシージャを実行します)。

DeliveryNote、Order、および Orderline も Response オブジェクトの内部クラスですが、簡潔にするために省略されていることに注意してください (他のいくつかのプロパティと同様)。

私が抱えている問題は、応答 (クライアント側) の Serials オブジェクトが次のようになっていることです。

<Serials>
    <string>123789456</string>
</Serials>

次のようになると予想される場合:

<Serials>
    <Serial>123789456</Serial>
</Serials>

ここで何が欠けていますか?

//編集: いくつかの詳細情報: サービスのクライアント側の実装には、SerialList クラスの次のものが含まれます。

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="GetSalesDeliveryNotesResponse.DeliveryNote.Order.Orderline.SerialList", Namespace="http://schemas.datacontract.org/2004/07/<my_namespace>/DeliveryNoteService.Contract.Response", ItemName="Serial")]
[System.SerializableAttribute()]
public class SerialList : System.Collections.Generic.List<string> { }
4

1 に答える 1

0

どうやら私のサービスは正しかった。WCFTestClientを使用すると、正しい応答が得られました。したがって、私自身のテストコードに問題がありました。

于 2012-10-01T08:32:51.490 に答える