2010-02-18 6 views
0

Мы добавили 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; 
    } 
+0

обязательно включение кеширование есть ** хорошо ** предмет. Я не уверен, как это может относиться к исключению и что может быть причиной. Reflection.Emit довольно загадочно, и часто невозможно сказать, что на самом деле происходит и почему. ** ЕСЛИ ** проблема сохраняется, попытайтесь создать изолированное воспроизведение и опубликуйте его в трекере по проблеме замка. Мы попытаемся найти решение. Вы управляете средним доверием? Включите ведение журнала DP, это поможет сузить проблему. 'proxyGenerator.Logger = someLogger;' –

+0

Мы полностью доверяем. С момента включения кэширования эта проблема не наблюдалась. Будет добавлен журнал, если проблема снова появится. Спасибо за вашу помощь. – charoco

ответ

2

фактически DynamicProxy является поточно поэтому весьма маловероятно, что параллелизм связаны.

Прежде всего, какую версию DynamicProxy вы используете?

Можете ли вы воспроизвести проблему изолированно, за пределами IIS?

Этот номер was reported two years ago, но был исправлен. Убедитесь, что у вас установлена ​​последняя версия.

+0

Эй, спасибо за ответ. Я начал обновление выше, прежде чем увидел ваш ответ. Можете ли вы подтвердить, что я там нашел? Я использую 2.2, BTW – charoco