WebService:複雑なタイプの配列を返す方法は?
-
26-09-2019 - |
質問
本当に2つの質問があり、私がこれを正しくやっているかどうかはわかりません...
作成したエンティティオブジェクトのある種の配列を送り返したいと思います。送信するためにマークを付ける方法(必要な属性など)が本当にわかりません。
理想的には、私はObservableCollectionを送り返すことができますが、サービスを消費したいクライアントが.NETにない場合、それは機能しますか?
[ServiceContract(Namespace = "http://www.tempuri.com/MyService",
ConfigurationName = "IMyService")]
public interface IMyServie
{
[OperationContract(Action = "http://www.tempuri.com/MyService/GetUsers",
ReplyAction = "*")]
[XmlSerializerFormat(SupportFaults = true)]
GetUsersResponse GetUsers(GetUsersRequest request);
}
[MessageContract(IsWrapped = false)]
public sealed class GetUsersRequest
{
public GetUsersRequest() { }
public GetUsersRequest(Int32 record = -1)
{
Record = record;
}
[MessageBodyMember(Namespace = "", Order = 0)]
public Int32 Record { get; private set; }
}
[MessageContract(IsWrapped = false)]
//[ServiceKnownType(??)]
public sealed class GetUsersResponse
{
public GetUsersResponse() { }
public GetUsersResponse(PersonEntity[] entities)
{
Entities = entities;
}
[MessageBodyMember(Namespace = "", Order = 1)]
//[XmlElement(DataType = "??")]
public PersonEntity[] Entities { get; private set; }
//Should this have been some other type of array-type (Collection, List, etc?)
}
//Does this need any attributes besides Serializable?
[Serializable()]
public PersonEntity : AbstractEntity
{
public PersonEntity() { }
public PersonEntity(Int32 id = 0, String fname = "", String lname = "")
{
ID = id;
FirstName = fname;
LastName = lname;
}
public String FirstName { get; set; }
public String LastName { get; set; }
//Functionality (Clone, Clear, Default, Equals, etc) Removed...
}
[Serializable()]
public abstract class AbstractEntity : IEntity
{
public Int32 ID { get; set; }
//Abstracts or Implements some functionality...
}
public interface IEntity
{
//Defines functionality requirements
}
解決
DataContractはあなたが探しているものです。詳細については、これを確認してください リンク
Observable Collection Frontでは、なぜ配列を送信するかがあなたにとって違う理由がわかりません。これを理解するためにもう少し詳しく説明していただけますか。
他のヒント
ワイヤー上にオブジェクトを渡すことになると、動作ではなくデータを考える必要があります。したがって、これに関する限り、リストまたはIENUMERABLEまたはT []は違いはなく、私の好みはすべての言語でサポートされている配列になります。サーバーは、クライアント(WPF、Windowsフォームなど)について知っていないか、知らせない仮定を立てるべきではありません。そして、あなたが渡しているのは、最も規範的なものが最良のデータのコレクションです:t [](t of tの配列)。
Myermianが言ったように、ワイヤーを介して送信されたあなたの観測可能な収集は、クライアントの観測可能な収集として機能しません。
また、ボディ/ヘッダーの利点を使用していない間、MessageContractを使用しています。したがって、DataContractを使用する必要があります。
最も操作可能な手段は、複雑なタイプの配列を返すことです。私の個人的な好みは、サービスを介して内部エンティティを直接公開するのではなく、ワイヤーを横切るために専用のDTOオブジェクトを使用することです。
それにかんする ObservableCollection
, 、私はあなたがあなたの配列をanで巻くことをお勧めします ObservableCollection
戻ってみようとするのではなく、クライアント側 ObservableCollection
.
それを念頭に置いて ObservableCollection
変更はサービスに送信されません。あなたはそれらを手動で行うためにaveするつもりです。