0

我们有一个 .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 序列化方法吗?

任何输入表示赞赏。

谢谢!

4

1 回答 1

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-throw-when-using-xslcompiledtransform.aspx。这是一个有点不同的上下文,但关于 IIS、堆栈大小和帧大小的讨论仍然适用。

于 2012-06-14T23:13:07.157 回答