使用XmlSerializer创建Temp动态程序集的WCF服务引用

时间:2015-04-08 08:52:35

标签: c# .net wcf memory-leaks .net-assembly

我一直在尝试诊断我认为是一个记录良好的内存泄漏,其中可执行文件的内存由于WCF服务引用(或旧式Web引用)而增加,因为它创建了动态临时程序集由XmlSerializer即时启动

我找到了之前的stackoverflow帖子here,其中还提供了this link,其中详细介绍了该问题。

它无法提供有关如何缓存XmlSerializer / MessageTypeConverter的任何想法,以防止创建这些动态程序集。

所以我的问题是 - 当序列化发生在WCF / .NET基础架构层的深处时,如何阻止XmlSerializer生成动态程序集?

有兴趣的是,这里是程序集的完整堆栈跟踪(由ANTS内存分析器提供:

System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule(string name)
System.Xml.Serialization.CodeGenerator.CreateModuleBuilder(Emit.AssemblyBuilder assemblyBuilder, string name)
System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly(Serialization.XmlMapping[] xmlMappings, Type[] types, string defaultNamespace, Policy.Evidence evidence)
System.Xml.Serialization.TempAssembly..ctor(Serialization.XmlMapping[] xmlMappings, Type[] types, string defaultNamespace, string location, Policy.Evidence evidence)
System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(Serialization.XmlMapping xmlMapping, Type type, string defaultNamespace, string location, Policy.Evidence evidence)
System.Xml.Serialization.XmlSerializer..ctor(Type type, Serialization.XmlAttributeOverrides overrides, Type[] extraTypes, Serialization.XmlRootAttribute root, string defaultNamespace, string location, Policy.Evidence evidence)
System.Xml.Serialization.XmlSerializer..ctor(Type type, Serialization.XmlAttributeOverrides overrides, Type[] extraTypes, Serialization.XmlRootAttribute root, string defaultNamespace, string location)
System.Xml.Serialization.XmlSerializer..ctor(Type type, Serialization.XmlRootAttribute root)

编辑:我还应该提一下,我知道这个MSDN article,但即使这样,我的可执行文件内存也会增加(上面的配置文件),所以看起来无论是什么原因MyLIbrary.XmlSerializers。 dll未被使用,或正在使用,但未被缓存。

1 个答案:

答案 0 :(得分:0)

事实证明,有一个显式调用使用attributeroot构造函数重载在我们的代码中实例化一个新的XmlSerializer。纠正这个问题解决了我们的问题。

我们还设法找到一种方法来手动覆盖在创建操作行为的wcf中使用的XmlSerializer。