我有一个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; }
}
答案 0 :(得分:4)
有两种选择:
具体集合类型(列表等)应该用作返回值,以便为WCF(Collection Types in Data Contracts, MSDN)提供序列化机制。
使用已知数据类型(Data Contract Known Types, MSDN)。