Мы добавили DynamicProxy к нашему веб-приложению ASP.NET пару недель назад. Код побежал штраф в разработчика и QA, но когда мы толкнули на производство, мы получили следующее исключение (верх только трассировки стека):Почему я получаю исключение отражения «Недопустимое внутреннее состояние» с помощью Castle DynamicProxy?
[ArgumentNullException: Invalid internal state.]
System.Reflection.Emit.TypeBuilder._InternalSetMethodIL (Int32 MethodHandle, булевой isInitLocals, Byte [] body, Byte [] LocalSig, Int32 sigLength, Int32 maxStackSize, Int32 numExceptions, __ExceptionInstance [] exceptions, 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 [] exceptions, Int32 [] tokenFixups, Int32 [] rvaFixups, модуль модуля) +56 Система. Reflection.Emit.TypeBuilder.Cre ateTypeNoLock() +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 (имя String, Type [] интерфейсы, INamingScope namingScope) +854 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode (тип [] интерфейсы, опции ProxyGenerationOptions) +834 замок .DynamicProxy.DefaultProxyBuilder.CreateClassProxyType (Тип classToProxy, Тип [] дополнительныеИнтерфейсыToProxy, Параметры ProxyGenerationOptions) +133 Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType (Тип classToProxy, Тип [] дополнительныеИнтерфейсыToProxy, ProxyGenerationOptions опции) +52 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (Тип classToProxy, Тип [] дополнительныеИнтерфейсыToProxy, ProxyGenerationOptions options, Object [] constructorArguments, IInterceptor [] перехватчики) +308 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (Тип classToProxy, Тип [ ] additionalInterfacesToProxy, опции ProxyGenerationOptions, IInterceptor [] перехватчики) +48 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (тип classToProxy, опции ProxyGenerationOptions, IInterceptor [] перехватчики) +44
Он работал хорошо, когда мы первый толкнул код, и IIS reset исправил его, поэтому я предполагаю, что он связан с потоком, но я не смог найти что-либо в interwebs относительно лучших методов генерации прокси-сервера для обеспечения безопасности потоков. Предложения?
ОБНОВЛЕНИЕ: прочитав еще несколько вопросов по этому вопросу, особенно here, я понял одну потенциальную проблему - а именно, что я не переписал Equals/GetHashCode для реализации IProxyGenerationHook, который я написал, что предотвратит кеширование DynamicProxy его типов , Поскольку я почти ничего не вижу в исключении, которое я видел, вообще говоря, не относящееся к DP, я предполагаю, что именно нехватка кеширования типов, вызванных моим упущением, была основной причиной проблемы, d любите подтверждение.
Для записи, мое создание объекта довольно ваниль:
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;
}
обязательно включение кеширование есть ** хорошо ** предмет. Я не уверен, как это может относиться к исключению и что может быть причиной. Reflection.Emit довольно загадочно, и часто невозможно сказать, что на самом деле происходит и почему. ** ЕСЛИ ** проблема сохраняется, попытайтесь создать изолированное воспроизведение и опубликуйте его в трекере по проблеме замка. Мы попытаемся найти решение. Вы управляете средним доверием? Включите ведение журнала DP, это поможет сузить проблему. 'proxyGenerator.Logger = someLogger;' –
Мы полностью доверяем. С момента включения кэширования эта проблема не наблюдалась. Будет добавлен журнал, если проблема снова появится. Спасибо за вашу помощь. – charoco