2014-11-26 11 views
2

웹 프로젝트 (ASP.NET 웹 API)의 컨트롤러에서 유닛 테스트를 실행할 때 예외가 발생합니다. 예외가 발생 될 때 LogManager.GetCurrentClassLogger() 컨트롤러가 실행된다 :nlog를 호출 할 때 MethodAccessException이 발생합니다. LogManager.GetCurrentClassLogger()

System.MethodAccessException : 시도 방법 'Castle.Proxies.ClaimsPrincipalProxy.GetObjectData (System.Runtime.Serialization.SerializationInfo,들은 System.Runtime.Serialization 의해. StreamingContext) '메서드에 액세스 할 수 없습니다. Castle.DynamicProxy.Internal.TypeUtil.Sort (System.Reflection.MemberInfo [])'가 실패했습니다.

결과적으로 LogManager.GetCurrentClassLogger()에 TypeInitializationException이 발생합니다. 여기 호출 스택이다

Castle.Proxies.ClaimsPrincipalProxy.GetObjectData (SerializationInfo에, StreamingContext) 에서 System.Runtime.Serialization.ObjectCloneHelper.GetObjectData에서 (serObj 문자열 & 유형 이름 문자열 & assemName, 문자열 [] 오브젝트 & fieldName에이 Object [] & fieldValues) System.Configuration.ClientConfigPaths.GetEvidenceInfo (AppDomain에 AppDomain에 문자열 exePath, REF 문자열 유형 이름) 에서 System.AppDomain.get_Evidence()에서 System.AppDomain.get_Evidence()에서 시스템에서 .Configuration.ClientConfigPaths.GetTypeAndHashSuffix (AppDomain appDomain, String exePat System.Configuration.ClientConfigurationHost.RequireCompleteInit (IInternalConfigRecord 기록) 에서 System.Configuration.ClientConfigPaths.GetPaths (문자열 exePath, 부울 includeUserConfig) 에서에서 System.Configuration.ClientConfigPaths..ctor (문자열 exePath, 부울 includeUserConfig) 에서 시간) System.Configuration.BaseConfigurationRecord.GetSectionRecursive (String configKey, Boolean getLkg, 부울 checkPermission, 부울 getRuntimeObject, 부울 requestIsHere, 객체 결과 ref, 객체 resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSection (String configKey) at System.Configuration. ConfigurationManager.GetSection (String sectionName) at NLog.Config.XmlLoggingConfiguration.get_AppConfig() at NLog.LogFactory.get_이 문제가 발생 단위 테스트 : NLog.LogManager.GetCurrentClassLogger()

업데이트에서 NLog.LogFactory.GetLogger (문자열 이름) 에서 NLog.LogFactory.GetLogger (LoggerCacheKey cacheKey) 에서 구성() NSubstitute 프로젝트 참조. 그래서 웹 API, NS substitute, NLog의 위험한 조합처럼 보입니다.

업데이트 2 : 컨트롤러에서 업셋 Nlog. 호출 컨트롤러 메소드 전에 나는 Thread.CurrentPrincipal에 대한 주체를 조롱 세트 :

var principal = Substitute.For<ClaimsPrincipal>(); 
principal.Identity.Returns(...); 
Thread.CurrentPrincipal = principal; 

방법이 고정 될 수 있을까?

+0

당신이 해결책을 찾았나요? 내 프로젝트에서 같은 예외가 있습니다. 외부 어셈블리에서 구현 된 복제 메서드에서 ... – Antiohia

답변

0

성 어셈블리는 AllowPartiallyTrustedCallersAttribute로 표시 될 수 있으며 레벨 2 보안 투명성 모델을 사용합니다.

수준 2 투명도로 설정하면 AllowPartiallyTrustedCallers 어셈블리의 모든 메서드가 기본적으로 보안 투명성을 갖게되어이 예외의 원인이 될 수 있습니다.

는 다음과 같은 속성을 사용하여 단위 테스트 (그리고 클래스) 주석을 시도 할 수 - [SecuritySafeCritical]

+1

[SecuritySafeCritical]이 작동하지 않습니다. –

관련 문제