StackOverflowException 序列化 STE EF 对象图

本文关键字:对象图 EF STE 序列化 StackOverflowException | 更新日期: 2023-09-27 18:37:18

我们有一个.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的dev IIS一起使用,而不能与生产IIS一起使用?

我不确定是什么导致了这个问题,或者为什么序列化程序甚至会倒钩?

我是否应该尝试使用 STE EF4 进行另一种 WCF 序列化方法?

任何意见都值得赞赏。

谢谢!

StackOverflowException 序列化 STE EF 对象图

(默认情况下)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、堆栈大小和帧大小的讨论仍然适用。