可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes
Posted
技术标签:
【中文标题】可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes【英文标题】:Maximum number of items that can be serialized or deserialized in an object graph... with knowtypes 【发布时间】:2012-02-29 18:16:00 【问题描述】:在 WCF 4.0 服务中,我们在通用列表中接收大量数据。此列表对象图大于 65536 默认限制。我们已经习惯了,所以我们已经配置了能够获取这些大图的服务。
<serviceBehaviors>
<behavior>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</serviceBehaviors>
使用上面的 xml 配置块,我们在过去没有问题地避免了这个问题,但现在它不起作用了。唯一的区别是,我们在这里尝试在 WCF 方法中反序列化的巨大列表元素中使用 KnownTypes。
也许,我是否缺少一些已知类型的特殊配置?
【问题讨论】:
你确定它是 MaxItemsInObjectGraph 被超过,而不是 MaxReceivedMessageSize? 例外是明确的'对象图中可以序列化或反序列化的最大项目数是'65535':( 您的服务是否声明了 behaviorConfiguration 属性?如果是这样,它不会选择上面的默认值 在我的测试和其他服务中确实如此,但我会尝试定义所有内容。 您在上面显示的行为块未命名 - 在 .NET 4 中,这将作为任何未明确声明行为配置的服务的默认值。如果您的服务这样做(例如,公开元数据),那么对 maxItemsInObjectGraph 的更改将不会被拾取 【参考方案1】:不要忘记检查客户端配置。
在How to fix MaxItemsInObjectGraph error?中查看类似答案
您需要设置 MaxItemsInObjectGraph dataContractSerializer 使用客户端和客户端上的行为 服务。
和maxItemsInObjectGraph ignored
我忘记将此设置放在我的客户端 app.config 文件中
.
【讨论】:
【参考方案2】:参考http://wcf.codeplex.com/discussions/258278,在类定义中加入如下ServiceBehavior属性,如下:
[ServiceContract]
[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)]
public class MaintenanceResource
【讨论】:
在生产中建议指定实际期望值,而不是MaxValue,配置文件是一个灵活的选项,但属性不灵活。【参考方案3】:正如迈克尔所说,我需要在我的客户端上添加这样的行为(在我网站的 web.config 中):
<behavior name="deepGraph">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
...
<client>
<endpoint address="..." behaviorConfiguration="deepGraph" ... />
</client>
【讨论】:
以上是关于可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes的主要内容,如果未能解决你的问题,请参考以下文章
可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes
使用 System.Text.Json 使用动态键查询或反序列化 json