2013-03-19 2 views
0

웹 및 작업자 역할이있는 Windows Azure 클라우드 서비스가 있습니다. 두 역할 모두 구성 루트에있는 Unity 컨테이너를 사용하여 유형을 등록합니다 (이 게시물의 최신 nuget pkg).Windows Azure 클라우드 서비스에 대한 Unity IOC와의 종속성을 해결할 때 생성자에서 NullReferenceException이 발생했습니다.

Azure 에뮬레이터에서 디버깅 할 때이 코드가 훌륭하게 작동하지만 패키지를 만들고 클라우드 서비스를 배포하면 역할이 실행될 때 즉시이 오류가 발생합니다 (웹 역할이 문제의 유형에 의존하는 페이지를 쳤을 때, 작업자 역할은 즉시 실행시에 히트됩니다). 여기

[ResolutionFailedException: Resolution of the dependency failed, type = "MyApp.Mvc.Controllers.HomeController", name = "(none)". 
Exception occurred while: Calling constructor MyApp.Azure.Messaging.ServiceBusMessagingClient(System.String serviceBusConnectionString). 
Exception is: NullReferenceException - Object reference not set to an instance of an object. 

는 애저 서비스 버스에 대한 래퍼 클라이언트입니다 내 타입의 ctor에있는 코드입니다 :

public ServiceBusMessagingClient(string serviceBusConnectionString) 
    { 
     Guard.NotNullOrEmpty(() => serviceBusConnectionString, serviceBusConnectionString); 

     _log = LogFactory.GetCurrentClassLogger(); 

     ConnectionString = serviceBusConnectionString; 

     _msgFactory = MessagingFactory.CreateFromConnectionString(ConnectionString); 
     _retryPolicy = new RetryPolicy<ServiceBusTransientErrorDetectionStrategy>(RetryStrategy.DefaultClientRetryCount); 
     _clients = new Dictionary<string, QueueClient>(); 
    } 

그리고 여기에있어 다음과 같이

나는 NullReferenceException이 무엇입니까 웹 app_start 또는 작업자 역할의 OnStart에서 호출되는 부트 스트 래퍼의 코드 :

var sbConn = CloudConfigurationManager.GetSetting(Constants.KeyServiceBusConnectionString); 
container.RegisterType<IMessagingClient, ServiceBusMessagingClient>(new InjectionConstructor(sbConn)); 

누구나 왜 그런 예외가 생겼는지 말해 줄 수 있습니까? null 참조를 생성 할 수있는 코드를 ctor 코드에서 볼 수 없습니다. 그리고 왜 그것이 에뮬레이터에서 작동하지만 클라우드 배치에서는 작동하지 않는지 이해할 수 없습니다. 이미 연결 문자열이 있는지 확인하기 위해 클라우드 설정을 확인했습니다. 감사!

답변

1

Ok ... System.Reflection.StackFrame을 만들 때 DEBUB에서 RELEASE로 모호한 동작이 변경되었습니다.

LogFactory.GetCurrentClassLogger() 방법은 다음 코드를 수행

StackFrame frame = new StackFrame(1, false); 

분명히, 릴리스 빌드에서,이 frame.GetMethod().DeclaringType에 대한 널 (null)을 얻을 것입니다 스택을 걸을 때.

따라서 null을 확인하고 로거 이름에 정적 문자열을 사용하십시오 (null 인 경우). 매일 무언가를 배우십시오. 희망이 사람을 도움이됩니다.

관련 문제