c# - REGDB_E_CLASSNOTREG 在应用程序池回收后使用 MsgPack Serializer 时
问题描述
我们在 IIS 10 中托管了一个 WCF 服务应用程序。
每次 IIS 在 20 分钟不活动后回收应用程序池时,我们在使用 MsgPack 进行反序列化时会得到以下异常:
The type initializer for 'MsgPack.Serialization.EmittingSerializers.SerializationMethodGeneratorManager' threw an exception. System.TypeInitializationException: The type initializer for 'MsgPack.Serialization.EmittingSerializers.SerializationMethodGeneratorManager' threw an exception. ---> System.Runtime.InteropServices.COMException: Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
at System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule(RuntimeAssembly containingAssembly, Boolean emitSymbolInfo, String name, String filename, StackCrawlMarkHandle stackMark, IntPtr& pInternalSymWriter, ObjectHandleOnStack retModule, Boolean fIsTransient, Int32& tkFile)
at System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule(RuntimeAssembly containingAssembly, Boolean emitSymbolInfo, String name, String filename, StackCrawlMark& stackMark, IntPtr& pInternalSymWriter, Boolean fIsTransient, Int32& tkFile)
at System.Reflection.Emit.AssemblyBuilder.DefineDynamicModuleInternalNoLock(String name, String fileName, Boolean emitSymbolInfo, StackCrawlMark& stackMark)
at System.Reflection.Emit.AssemblyBuilder.DefineDynamicModuleInternal(String name, String fileName, Boolean emitSymbolInfo, StackCrawlMark& stackMark)
at System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule(String name, String fileName, Boolean emitSymbolInfo)
at MsgPack.Serialization.EmittingSerializers.SerializationMethodGeneratorManager..ctor(Boolean isDebuggable, Boolean isCollectable, AssemblyBuilder assemblyBuilder)
at MsgPack.Serialization.EmittingSerializers.SerializationMethodGeneratorManager.Create(Boolean isDebuggable, Boolean isCollectable, AssemblyBuilder assemblyBuilder)
at MsgPack.Serialization.EmittingSerializers.SerializationMethodGeneratorManager..cctor()
--- End of inner exception stack trace ---
at MsgPack.Serialization.EmittingSerializers.SerializationMethodGeneratorManager.Get(SerializationMethodGeneratorOption option)
at MsgPack.Serialization.EmittingSerializers.AssemblyBuilderSerializerBuilder.<>c__DisplayClass63_0.<CreateCodeGenerationContextForSerializerCreation>b__1()
at MsgPack.Serialization.EmittingSerializers.AssemblyBuilderEmittingContext.get_Emitter()
at MsgPack.Serialization.EmittingSerializers.AssemblyBuilderEmittingContext.BeginMethodOverride(String name)
at MsgPack.Serialization.AbstractSerializers.SerializerBuilder`2.BuildObjectPackTo(TContext context, SerializationTarget targetInfo, Boolean isAsync)
at MsgPack.Serialization.AbstractSerializers.SerializerBuilder`2.BuildObjectSerializer(TContext context)
at MsgPack.Serialization.AbstractSerializers.SerializerBuilder`2.BuildSerializer(TContext context, Type concreteType, PolymorphismSchema schema, SerializationTarget& targetInfo)
at MsgPack.Serialization.AbstractSerializers.SerializerBuilder`2.BuildSerializerInstance(SerializationContext context, Type concreteType, PolymorphismSchema schema)
at MsgPack.Serialization.MessagePackSerializer.CreateInternal[T](SerializationContext context, PolymorphismSchema schema)
at MsgPack.Serialization.SerializationContext.GetSerializer[T](Object providerParameter)
当我手动回收应用程序池时,问题消失了,一切正常。在发生自动回收事件之前,问题又回来了。
在应用程序使用以下代码启动后,我已经强制所有程序集立即加载到 AppDomain 中:
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
有人知道吗?
解决方案
推荐阅读
- java - Java:在 JFrame 中使用 add(ClassName) 时如何访问类变量
- java - 命令模式在这里适用吗?
- php - 获取数据库中 item_type 的值并在选项中选择它
- javascript - 重新加载 DOMContent
- tsql - MSSQL IP 地址更新为二进制 (32)
- javascript - 使用变量而不是值更改键名
- docker - 如何在没有 JAR 的情况下为 Spring Boot 应用程序构建 Docker 映像
- mapbox - Mapbox GL JS:更改多边形边框宽度
- java - 打开 Selenium 浏览器的方法不与我当前的浏览器重叠
- c - 如何使用双指针释放树结构?