StackOverflowException序列化STE EF对象图

时间:2012-06-14 18:46:22

标签: c# wcf entity-framework iis serialization

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

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

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?

我不确定导致这个问题的原因是什么,或者为什么序列化器甚至会发生气流?

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

赞赏任何意见。

谢谢!

1 个答案:

答案 0 :(得分: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,堆栈大小和帧大小的讨论仍然适用。