У меня есть служба WCF, у которой есть методы для возврата IEnumerable<T>
коллекций объектов, а также сложный тип OrganizationCollection
, который имеет несколько свойств, каждое из которых IEnumerable<T>
разных типов. Я считаю, что правильно настроил свой сервисный контракт и правильно определил типы DataContract
/ DataMember
. Метод, который возвращает OrganizationCollection
, завершается с ошибкой. Я знаю, что метод работает, так как у меня есть модульные и интеграционные тесты, которые его тестируют. Только при работе с работающим и развернутым сервисом происходит сбой. Я даже указал тип как ServiceKnownType
, но безрезультатно. Что мне нужно сделать, чтобы настроить службу для возврата сложных типов, таких как OrganizationCollection
?
Примечание. Служба WCF работает с basicHttpBinding
и размещается в ServiceHost
в службе Windows.
[System.ServiceModel.CommunicationException] {"Произошла ошибка при получении ответа HTTP на http://localhost:8799/MyService. Это может быть связано с тем, что привязка конечной точки службы не использует протокол 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; }
}