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

时间:2010-08-31 16:29:25

标签: c# wcf collections observablecollection complextype

真的有2个问题,我不确定我是否正确行事......

我想为我创建的Entity对象发回一些数组。我不确定如何标记发送(需要什么属性或其他什么),我不确定如何发回(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
}

3 个答案:

答案 0 :(得分:1)

DataContract是您正在寻找的。有关详细信息,请查看此link

在Observable收集方面,不确定为什么发送数组会对你有所不同。你能详细说明一下,以帮助我们理解这一点。

答案 1 :(得分:1)

当涉及通过线路传递对象时,您必须考虑数据而不是行为。所以就这一点而言,List或IEnumerable或T []不会有所不同,我的偏好是所有语言都支持的数组。服务器不应该知道或做出关于客户端的任何不必要的假设(WPF,Windows表单,...),所有你传递的是数据的集合,所以最不规范的是最好的:T [](T的数组)。

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

此外,您正在使用MessageContract,而不使用Body / Header的任何好处。所以你必须使用DataContract。

答案 2 :(得分:0)

最可互操作的方法是返回一个复杂类型的数组,无论你决定是什么。我个人的偏好是使用专用的DTO对象通过线路传输,而不是直接通过服务公开内部实体。

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

请注意,ObservableCollection不会将更改传回服务;你会手动做那些。