几周前,我们将 DynamicProxy 添加到我们的 ASP.NET Web 应用程序中。代码在 dev 和 QA 中运行良好,但是当我们推送到生产环境时,我们得到了以下异常(仅限堆栈跟踪顶部):
[ArgumentNullException: Invalid internal state.]
System.Reflection.Emit.TypeBuilder._InternalSetMethodIL(Int32 methodHandle, Boolean isInitLocals, Byte[] body, Byte[] LocalSig, Int32 sigLength, Int32 maxStackSize, Int32 numExceptions, __ExceptionInstance[] 异常, Int32[] tokenFixups, Int32[] rvaFixups,模块模块) +0 System.Reflection.Emit.TypeBuilder.InternalSetMethodIL(Int32 methodHandle, Boolean isInitLocals, Byte[] body, Byte[] LocalSig, Int32 sigLength, Int32 maxStackSize, Int32 numExceptions, __ExceptionInstance[] 异常, Int32[] tokenFixups, Int32[] rvaFixups,模块模块)+56 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() +1033 System.Reflection.Emit.TypeBuilder.CreateType() +99 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder 类型) +72 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter。BuildType() +96 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(字符串名称,Type[] 接口,INamingScope 命名范围)+854 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type[] 接口,ProxyGenerationOptions 选项)+834 Castle。 DynamicProxy.DefaultProxyBuilder.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions 选项) +133 Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions 选项) +52 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy , Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] 拦截器) +308 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy,Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] 拦截器) +48 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, ProxyGenerationOptions options, IInterceptor[] 拦截器) +44
当我们第一次推送代码时它运行良好,并且 IIS 重置修复了它,所以我假设它与线程相关,但我在互联网上找不到任何关于线程安全代理生成的最佳实践的信息。建议?
更新:在阅读了更多关于这个问题的内容后,尤其是这里,我意识到一个潜在的问题——即我没有为我编写的 IProxyGenerationHook 的实现覆盖 Equals/GetHashCode,这将阻止 DynamicProxy 缓存它的类型。正如我在一般情况下看到的异常几乎一无所获,更不用说与 DP 相关了,我会假设我的遗漏导致的类型缺乏缓存是问题的根本原因,尽管我我喜欢确认。
作为记录,我的对象创建非常简单:
private T CreateProxy(MyArgs args)
{
var options = new ProxyGenerationOptions(new MyMethodSelector());
options.AddMixinInstance(new MyMixin());
return Generator.CreateClassProxy(
TargetType,
options,
new[] { new MyInterceptor(args) }) as T;
}