WCF DataContract - невозможно вернуть сложный тип - PullRequest
4 голосов
/ 01 февраля 2012

У меня есть служба 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; }
}

1 Ответ

4 голосов
/ 01 февраля 2012

Есть два варианта:

  1. Тип сбора бетона (Список и т. Д.) Должен использоваться в качестве возвращаемого значения для обеспечения механизма сериализации для WCF ( Типы сбора в контрактах данных, MSDN ).

  2. Использование известных типов данных ( Известные типы контракта данных, MSDN ).

...