WCF DataContract - 无法返回复杂类型

时间:2012-02-01 19:36:13

标签: c# wcf web-services ienumerable

我有一个WCF服务,它有返回IEnumerable<T>个对象集合的方法,还有一个复杂类型OrganizationCollection,它有一些属性,每个属性都是IEnumerable<T>个不同种类。我相信我已正确设置了服务合同,并正确定义了我的类型DataContract / DataMember。返回OrganizationCollection的方法失败并出现异常。我知道该方法起作用,因为我有测试它的单元和集成测试。只有在使用实时和已部署的服务运行时才会失败。我甚至将类型指定为ServiceKnownType,但无济于事。我需要做什么才能将服务配置为能够返回复杂类型,如OrganizationCollection

注意:WCF服务与basicHttpBinding一起运行,并且位于Windows服务中的ServiceHost

  

[System.ServiceModel.CommunicationException] {“接收到http://localhost:8799/MyService的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于HTTP请求上下文被服务器中止(可能是由于服务关闭)。有关更多详细信息,请参阅服务器日志。“} System.ServiceModel.CommunicationException

[ServiceBehavior(IncludeExceptionDetailInFaults = true, AutomaticSessionShutdown = false, InstanceContextMode = InstanceContextMode.Single)]
[ServiceKnownType(typeof(OrganizationCollection))]
public class MyService: IClientService
{ 
    // ...
}

[ServiceContract]
public interface IClientService
{
    // This works:
    [OperationContract]
    IEnumerable<BookSvc> GetBooks(DateTime sinceDate);

    // This fails, with the above exception:
    [OperationContract]
    OrganizationCollection GetOrganizations(DateTime sinceDate);
}

BookSvc定义为[DataContract],每个属性都有[DataMember]。教师和学生课程也是如此。属性都是原始类型。 OrganizationCollection定义为:

[DataContract]
public class OrganizationCollection
{
    [DataMember]
    public IEnumerable<Teacher> Teachers { get; set; }

    [DataMember]
    public IEnumerable<Student> Students { get; set; }
}

1 个答案:

答案 0 :(得分:4)

有两种选择:

  1. 具体集合类型(列表等)应该用作返回值,以便为WCF(Collection Types in Data Contracts, MSDN)提供序列化机制。

  2. 使用已知数据类型Data Contract Known Types, MSDN)。