【问题标题】:Error while deserializing the object in WCF反序列化 WCF 中的对象时出错
【发布时间】:2011-07-29 02:39:17
【问题描述】:

我在 WCF 中创建了一个 REST 服务。我面临以下问题

反序列化 System.Collections.Generic.IList 类型的对象时出错。已超过最大读取深度 (32),因为正在读取的 XML 数据的嵌套级别超过了配额所允许的级别。可以通过更改创建 XML 阅读器时使用的 XmlDictionaryReaderQuotas 对象的 MaxDepth 属性来增加此配额。

我没有在配置中指定任何类型的绑定,因为我已经按照 REST Starter Kit 开发了服务。请提出一些关于如何解决它的建议。

代码有时运行良好,但确实会抛出错误。

【问题讨论】:

  • 1) 发布堆栈跟踪 2) 包括您要序列化其列表的类的定义,它看起来像一个循环引用跨度>

标签: wcf serialization rest


【解决方案1】:

就我而言,问题在于我返回的是从数据上下文中获取的实体框架对象。解决方案是在重新调整它们之前分离每个对象。

【讨论】:

    【解决方案2】:

    在我的例子中,分离对象是不可能的,因为 EF 上下文已经被释放了。

    相反,我使用了AsNotTracking 扩展方法。

    ...在其他一些情况下,我还必须通过将一些导航属性设置为 null 来减少循环引用。

    ...而DataContract(IsReference = true) 没有做到这一点。

    关于这个问题的更多细节可以在这里找到:N-tier Entity Framework and debugging WCF problems

    【讨论】:

      【解决方案3】:

      应改用REST Starter Kit is no longer supportedASP.NET Web API 或任何其他最新的 REST 框架。

      【讨论】:

        【解决方案4】:

        我今天遇到了同样的问题。如果您没有在数据合同中正确设置 KnowType 和 IsReference,它可能是循环引用。 首先检查这些点。真的!

        但是当你面对这种行为时。

        代码有时运行良好,但确实会抛出错误。

        您还应该检查您通过网络发送的图表是否深度和复杂(例如深度超过两个导航属性)。那么它可能只是您的绑定配置中 ReaderQuotas 的 MaxDepth 太低了。当您的最深层导航属性为空时,您的服务将起作用,但当它们包含至少一个元素时会引发此错误。

        这个配置的默认值是32,所以试试64。

        现在我们可以争论在服务上使用太多深度图的低质量设计与 WCF 配置中的低默认值。

        我并不是说您必须将图表分成较小的部分,但您应该这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多