System.ComponentModel.DataAnnotations MethodAccessException в автоматическом модульном тестировании контроллера, MVC - PullRequest
2 голосов
/ 15 июня 2011

Прежде всего, я хотел бы сказать, что я не сомневаюсь, что это ошибка конфигурации, потому что это происходит только на нашем сервере сборки CI, а не на чьей-либо локальной машине разработки. Поэтому, если у кого-то есть очевидное предложение по конфигурации, пожалуйста, не стесняйтесь указывать на это, моя команда не настраивает сервер сборки, так что может быть что-то просто неправильно настроенное.

У меня проблема с одним из моих автоматических тестов. У меня эта проблема возникает в любом тесте, который включает (System.ComponentModel.) DataAnnotations на используемом объекте. Похоже, что это происходит только с любым тестом, который включает контроллер, вызывающий TryUpdateModel.

Прежде чем я предоставлю полное сообщение об ошибке, вот список некоторых вещей, которые мы уже попробовали:

  • Добавление основных сборок MVC в раздел «fullTrustAssemblies» app.config тестового проекта
  • Добавление сборки System.ComponentModel.DataAnnotations в раздел «partalTrustVisibleAssemblies »файла app.config тестового проекта
  • Добавление сборки System.ComponentModel.DataAnnotations в AppDomainSetup PartialTrustVisibleAssemblies в коде
  • Попытка использовать ReflectionPermission.Demand, чтобы увидеть, была ли проблема с разрешениями
  • Гарантия того, что .NET Framework 4 и MVC3 были установлены на компьютере
  • Проверка ключей (ей) реестра о которых говорилось в этой статье

Вот полная ошибка:

Test method qTrade.UnitTests.Web.Controllers.Maintenance.TypeLookupControllerTest.CreatePostSaveInvalidEntityAndModelState threw exception: 
System.MethodAccessException: Attempt by security transparent method 'System.Web.Mvc.TypeDescriptorHelper.Get(System.Type)' to access security critical method 'System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider..ctor(System.Type)' failed.

Assembly 'System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is a conditionally APTCA assembly which is not enabled in the current AppDomain.  To enable this assembly to be used by partial trust or security transparent code, please add assembly name 'System.ComponentModel.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9' to the the PartialTrustVisibleAssemblies list when creating the AppDomain

Test method qTrade.UnitTests.Web.Controllers.Maintenance.TypeLookupControllerTest.CreatePostSaveInvalidEntityAndModelState threw exception: 
System.MethodAccessException: Attempt by security transparent method 'System.Web.Mvc.TypeDescriptorHelper.Get(System.Type)' to access security critical method 'System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider..ctor(System.Type)' failed.

Assembly 'System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is a conditionally APTCA assembly which is not enabled in the current AppDomain.  To enable this assembly to be used by partial trust or security transparent code, please add assembly name 'System.ComponentModel.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9' to the the PartialTrustVisibleAssemblies list when creating the AppDomain.<br>    at System.Web.Mvc.TypeDescriptorHelper.Get(Type type)
   at System.Web.Mvc.ModelBinders.GetBinderFromAttributes(Type type, Func`1 errorMessageAccessor)
   at System.Web.Mvc.ModelBinderDictionary.GetBinder(Type modelType, IModelBinder fallbackBinder)
   at System.Web.Mvc.ModelBinderDictionary.GetBinder(Type modelType, Boolean fallbackToDefault)
   at System.Web.Mvc.Controller.TryUpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
   at qTrade.UI.Web.Controllers.Maintenance.TypeLookupController.Create(FormCollection collection) in d:\cibuild\qTrade\qTradeCI\Sources\source\UI\qTrade.UI.Web\Controllers\Maintenance\TypeLookupController.cs:line 55
   at qTrade.UnitTests.Web.Controllers.Maintenance.TypeLookupControllerTest.CreatePostSaveInvalidEntityAndModelState() in d:\cibuild\qTrade\qTradeCI\Sources\source\Tests\qTrade.UnitTests\Web\Controllers\Maintenance\TypeLookupControllerTest.cs:line 178
   at System.Web.Mvc.TypeDescriptorHelper.Get(Type type)
   at System.Web.Mvc.ModelBinders.GetBinderFromAttributes(Type type, Func`1 errorMessageAccessor)
   at System.Web.Mvc.ModelBinderDictionary.GetBinder(Type modelType, IModelBinder fallbackBinder)
   at System.Web.Mvc.ModelBinderDictionary.GetBinder(Type modelType, Boolean fallbackToDefault)
   at System.Web.Mvc.Controller.TryUpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
   at qTrade.UI.Web.Controllers.Maintenance.TypeLookupController.Create(FormCollection collection) in d:\cibuild\qTrade\qTradeCI\Sources\source\UI\qTrade.UI.Web\Controllers\Maintenance\TypeLookupController.cs:line 55
   at qTrade.UnitTests.Web.Controllers.Maintenance.TypeLookupControllerTest.CreatePostSaveInvalidEntityAndModelState() in d:\cibuild\qTrade\qTradeCI\Sources\source\Tests\qTrade.UnitTests\Web\Controllers\Maintenance\TypeLookupControllerTest.cs:line 178

Любые предложения будут с благодарностью, спасибо!

1 Ответ

1 голос
/ 15 сентября 2011

Я исправил проблему!

Это комбинация работы в Medium Trust с установкой MVC в GAC и использованием «динамического» (или фигуры) в качестве модели представления. Только (и только если) эти 3 условия верны, вы сталкиваетесь с этой ошибкой. Решение состоит в том, чтобы изменить код контроллера: вместо возврата «View (модель)» верните «View ((объект) модель)».

...