WCF - Украшение IEnumerable <T>с помощью DataMember вызывает исключение: основное соединение было закрыто: соединение было неожиданно закрыто - PullRequest
8 голосов
/ 03 февраля 2011

Я создал службу WCF, которая возвращает IEnumerable<CyberResourceProvisioningAction>.

Тип CyberResourceProvisioningAction имеет свойство AccountInformation IEnumerable<CyberResourceProvisioningActionAccountInfo>. Когда я украшаю свойство AccountInformation с помощью DataMemberAttribute, я получаю исключение:

WCF System.Net.WebException: основная связь была закрыта: соединение было неожиданно закрыто

Очевидно, это очень общее исключение, но мой Google-fu указывает, что проблема чаще всего возникает при возврате большого количества объектов в коллекции. Предлагаемое исправление - установить <dataContractSerializer maxItemsInObjectGraph="2147483646"/>. К сожалению, это не решило мою проблему. (Не думаю, что это произойдет, поскольку я возвращаю небольшое количество данных).

Свойства установлены правильно, поэтому я почти уверен, что моя проблема связана с моей конфигурацией сериализации. Что-то не так с моими классами, что приводит к ошибке службы WCF таким образом?

[DataContract]
public class CyberResourceProvisioningAction
{
    [DataMember]
    public string Action { get; set; }

    [DataMember]
    public DateTime RcdChgDateTime { get; set; }

    [DataMember]
    public string CyberResourceName { get; set; }

    [DataMember]
    public IEnumerable<CyberResourceProvisioningActionAccountInfo> AccountInformation
    { get; set; }
}

CyberResourceProvisioningActionAccountInfo

[DataContract]
public class CyberResourceProvisioningActionAccountInfo
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Value { get; set; }
}

Если потребуется дополнительная информация о конфигурации, дайте мне знать, и я отредактирую сообщение.

1 Ответ

14 голосов
/ 04 февраля 2011

Из-за комментария о "нарушении модели программирования DataContract", оставленного alexdej , я начал присматриваться к тому, что было в моих свойствах.У меня был тип Linq в свойстве, и хотя это был IEnumerable, он не перечислялся для сериализации.Добавил .ToList() и все хорошо.

...