C# WebService:如何返回复杂类型的数组?

C# WebService:如何返回复杂类型的数组?,c#,wcf,collections,observablecollection,complextype,C#,Wcf,Collections,Observablecollection,Complextype,两个问题真的,我不确定我做的是否正确 我想为我创建的实体对象发回某种数组。我不确定如何将其标记为发送(需要哪些属性或其他),也不确定如何将其发送回(IList、List、Collection、ICollection) 理想情况下,我希望能够发回一个ObservableCollection,但如果想要使用该服务的客户机不在.NET中,这会起作用吗 [ServiceContract(Namespace = "http://www.tempuri.com/MyService",

两个问题真的,我不确定我做的是否正确

我想为我创建的实体对象发回某种数组。我不确定如何将其标记为发送(需要哪些属性或其他),也不确定如何将其发送回(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
}

最具互操作性的方法是返回一个复杂类型的数组,不管您决定它是什么。我个人的偏好是使用专用的DTO对象进行跨线传输,而不是直接通过服务公开内部实体

关于
observedcollection
,我建议您将数组包装在
observedcollection
客户端,而不是尝试返回
observedcollection


请记住,
ObservableCollection
不会将更改传输回服务;你必须手动操作

DataContract就是您要寻找的。有关更多详细信息,请查看此


在可观察收集方面,不确定为什么发送数组对您来说会有任何不同。你能再详细一点来帮助我们理解这一点吗。

当涉及到通过导线传递对象时,你必须考虑数据而不是行为。就这一点而言,列表、IEnumerable或T[]不会有所不同,我更喜欢所有语言都支持的数组。服务器不应该知道或对客户机(WPF、Windows窗体等)做出任何不必要的假设,您传递的只是一组数据,因此最不规范的是最好的:T[](T的数组)

正如myermian所说,您通过网络发送的ObservableCollection将不会作为客户端上的ObservableCollection工作


另外,您使用的是MessageContract,而没有使用其Body/Header的任何优点。因此,您必须使用DataContract。

我建议将[Serializable]替换为[DataContract]。您必须在父抽象类和接口上标记此DataContract吗?在派生类Personentity上具有属性就足够了。因为这是通过通道交换的唯一类型,我只是想看看是否可以跳过数组到ObservableCollection的步骤,因为客户端将是WPF。@myermian:您可能可以--
OC
毕竟是可序列化的--但我不会。首先,你得不到任何好处;例如,如果服务有新数据,服务返回的
OC
将不会更新,对它的更新也不会传播回服务。其次,它将不必要地破坏您可能获得的任何互操作。这对你来说可能是个问题,也可能不是,但对我来说永远都是个问题——我想保留我的选择余地。