WCF - 使用 DataMember 装饰 IEnumerable<T> 导致异常:底层连接已关闭:连接意外关闭。

8

我创建了一个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; }
}

网络资源配给操作账户信息

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

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

如果需要额外的配置信息,请告诉我,我会编辑帖子。

2
如果您启用了帮助页面,请浏览该页面以查看是否出现激活异常;否则,请附加调试器并捕获异常。这似乎是DataContract编程模型违规的问题。 - alexdej
@alexdej 我已经附加了一个调试器,但从未触发任何异常。异常在 WCF 测试客户端中显示,但不在我的调试器中显示。 - ahsteele
1
尝试直接对你的WCF主机项目进行调试,并用WcfTestClient测试你的服务调用。 - Yannick Motton
1个回答

14

由于alexdej留下的“DataContract编程模型违规”的评论,我开始仔细查看我的属性中有什么。 我的属性中有一个Linq类型,尽管它是IEnumerable,但它没有被枚举进行序列化。添加了.ToList()后一切正常。


1
我从我的服务中收到以下错误:Type 'System.Data.Entity.Infrastructure.DbQuery1[MYCLASS]' 无法序列化。请考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute进行标记。有关其他支持的类型,请参阅Microsoft .NET Framework文档。 在返回语句之前添加.ToList()解决了我的问题。谢谢! - MaciejLisCK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接