StackruException, сериализующий граф объектов STE EF

У нас есть приложения.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? Почему это будет работать с dev IIS Visual Studio, но не с производственным IIS?

Я не уверен, что является причиной этой проблемы или почему сериализатор даже barfing?

Стоит ли попробовать другое средство сериализации WCF с STE EF4?

Любой вклад приветствуется.

Спасибо!

1 ответ

Решение

(По умолчанию) IIS ограничивает размер стека управляемых потоков до 256 КБ. Я не знаю о веб-сервере Dev, но размер стека по умолчанию для управляемых потоков составляет 1 МБ. Кроме того, если вы работаете на 64-битной машине, фреймы стека обычно больше, чем стековые фреймы на 32-битной машине. Таким образом, если ваш dev-блок 32-битный, вы можете не увидеть то, что видите в работе. Я написал немного об этом здесь http://blogs.msdn.com/b/xmlteam/archive/2011/09/26/effective-xml-part-5-something-went-really-wrong-outofmemoryexception-and-stackruexception-thrown-when-using-xslcompiledtransform.aspx. Это немного другой контекст, но дискуссия о IIS, размерах стека и размерах фреймов все еще применима.

Другие вопросы по тегам