【问题标题】:StackOverflowException serializing STE EF object graphStackOverflowException 序列化 STE EF 对象图
【发布时间】:2012-06-14 18:46:22
【问题描述】:

我们有一个 .NET 4、WPF、WCF、EF 4、SQL 2008 应用程序。我们的 EF 模型之一是高度相关的,在我所描述的情况下,可能并且可能确实包含循环。我被要求对现场的一个案例进行故障排除,该案例中来自该 STE EF 模型的所有数据突然退出显示在 WPF 客户端中。经过仔细检查,我发现 IIS W3WP 进程在尝试检索(序列化)STE EF 对象图时崩溃。我使用调试诊断来捕获崩溃。

当我查看生成的崩溃报告时,我发现这是一个堆栈溢出异常(多么恰当)。崩溃报告中的堆栈跟踪相当大,但堆栈顶部看起来像:

System.Xml.XmlBaseWriter.StartElement(System.String ByRef, System.String, System.String, System.Xml.XmlDictionaryString) 
System.Xml.XmlBaseWriter.WriteStartElement(System.String, System.Xml.XmlDictionaryString, System.Xml.XmlDictionaryString) 
System.Runtime.Serialization.XmlWriterDelegator.WriteStartElement(System.String, System.Xml.XmlDictionaryString, System.Xml.XmlDictionaryString) 
DynamicClass.WriteXXXDataToXml(System.Runtime.Serialization.XmlWriterDelegator, System.Object, System.Runtime.Serialization.XmlObjectSerializerWriteContext, System.Runtime.Serialization.ClassDataContract) 
System.Runtime.Serialization.ClassDataContract.WriteXmlValue(System.Runtime.Serialization.XmlWriterDelegator, System.Object, System.Runtime.Serialization.XmlObjectSerializerWriteContext) 
System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(System.Runtime.Serialization.DataContract, System.Runtime.Serialization.XmlWriterDelegator, System.Object, System.RuntimeTypeHandle) 
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator, System.Object, Boolean, Boolean, Int32, System.RuntimeTypeHandle) 
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(System.Runtime.Serialization.XmlWriterDelegator, System.Object, Boolean, Boolean, Int32, System.RuntimeTypeHandle) 

特别奇怪的是,当 WCF 服务托管在 Visual Studio 中并且我从开发环境中运行时,序列化工作完美,并且我在客户端上获取数据。

这可以通过 IIS 设置解决吗?为什么它可以与 Visual Studio 的开发 IIS 一起使用,但不能与生产 IIS 一起使用?

我不确定是什么导致了这个问题,或者为什么序列化器会出现问题?

我应该尝试使用 STE EF4 的另一种 WCF 序列化方法吗?

感谢任何输入。

谢谢!

【问题讨论】:

    标签: c# wcf entity-framework iis serialization


    【解决方案1】:

    (默认情况下)IIS 将托管线程的堆栈大小限制为 256 KB。我不了解开发 Web 服务器,但托管线程的默认堆栈大小为 1 MB。此外,如果您在 64 位机器上运行,堆栈帧通常比 32 位机器上的堆栈帧大。因此,如果您的开发盒是 32 位的,您可能看不到您在生产中看到的内容。我在这里http://blogs.msdn.com/b/xmlteam/archive/2011/09/26/effective-xml-part-5-something-went-really-wrong-outofmemoryexception-and-stackoverflowexception-thrown-when-using-xslcompiledtransform.aspx 写了一些关于此的内容。这是一个有点不同的上下文,但关于 IIS、堆栈大小和帧大小的讨论仍然适用。

    【讨论】:

    • 太棒了!感谢您的输入。我保证是这样的。关于如何在 IIS 中更新堆栈大小的任何想法?这篇文章blogs.msdn.com/b/tom/archive/2008/03/31/… 描述了如何使用editbin.exe 进行操作。但是我们在生产环境中没有这个 exe。我可以更新我机器上的 w3wp.exe 应用程序,但我不能只替换客户机器上的那个文件,除非我有 TrustedInstaller 权限。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多