网络服务:如何返回复杂类型的数组?
-
26-09-2019 - |
题
确实有2个问题,我不确定我这样做是否正确......
我想为我创建的实体对象发回某种数组。我不太确定如何将其标记为发送(需要什么属性或其他),并且我不太确定如何将其发回(IList、List、Collection、ICollection)。
理想情况下,我希望能够发回 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是您要寻找的。有关更多详细信息,请检查此 关联
在可观察的收集方面,不确定为什么发送阵列对您有什么不同。您能否详细说明以帮助我们理解这一点。
其他提示
当涉及到通过网络传递对象时,您必须考虑数据而不是行为。因此,就这一点而言,List 或 IEnumerable 或 T[] 不会有什么不同,我更喜欢所有语言都支持的数组。服务器不应该知道或对客户端(WPF、Windows 窗体等)做出任何不必要的假设,并且您传递的只是数据集合,因此最少的规定是最好的:T[](T 数组)。
正如 myermian 所说,通过网络发送的 ObservableCollection 不会在客户端上作为 ObservableCollection 工作。
此外,您正在使用 MessageContract,但没有使用 Body/Header 的任何好处。所以你必须使用DataContract。
最可行的手段是返回复杂类型的数组,无论您决定是什么。我的个人偏爱是使用专用的DTO对象在电线上传输,而不是直接通过服务揭露内部实体。
关于 ObservableCollection
, ,我建议您将您的数组包裹在一个 ObservableCollection
客户端而不是尝试返回 ObservableCollection
.
请记住 ObservableCollection
不会将更改传输回服务;您要去手动做这些。