2013-06-15 4 views
3

배포 된 Azure Cloud Service WebRole WebAPI에 인스턴스가 하나만 있습니다. 나는 약간의 유휴 시간 (없음 HTTP 요청), 그런 다음 나중에 서비스에 죽은, 그리고 그것에 모든 요청은 다음과 같은 응답 결과를 기다리면 것으로 나타났습니다 :응용 프로그램 풀 재활용 후 Azure 클라우드 서비스가 종료되었습니다.

{ 
    Message: "An error has occurred." 
} 

푸른 관리 대시 보드 인스턴스가 말한다 상태가 실행 중입니다. 원격 데스크톱은 응용 프로그램 풀과 웹 사이트가 모두 실행 중이며 필요한 모든 서비스가 실행되고 있음을 나타냅니다.
어디서나 관련된 오류 메시지를 찾을 수 없습니다 ...

유일한 해결책은 위의 상황에서 인스턴스 VM을 재부팅하는 것입니다.

위의 내용이 유휴 시간의 결과라고 가정 했으므로 기본적으로 응용 프로그램 풀 자체에 유휴 시간 제한 속성이 20 분으로 설정되어있어 응용 프로그램 풀 내부의 작업자 프로세스가 종료되는 것으로 나타났습니다. 유휴 시간 초과에 도달하면 응용 프로그램 풀 재활용을 수동으로 트리거하여 시간 초과를 기다리지 않고 문제를 재현 할 수있었습니다.

나는 내 서비스에 문제가 있다고 가정하고, 올바르게 종료 할 수 없다. 증거로서, 깨끗한 out-of-the-box 서비스 프로젝트는 동일한 행동으로 발생하지 않았습니다.

이러한 문제의 원인은 무엇입니까?
누구든지 정확한 디버깅 방향을 알려줄 수 있습니까?
어디에서 유용한 오류 추적 메시지를 찾을 수 있습니까?

편집 : 나는 IOC의에 대한 Autofac을 사용하고
, 갑자기 문제가 IOC는 어떻게 든 재활용 후 취소되었는지 될 수 있음을 나에게 발생했습니다. Application_Start()의 IoC 등록을 Global.asax.cs으로 수행하고 있습니다.
문제 일 수 있습니까?

답변

1

IIS에서 AppDomain을 재활용하면 어셈블리는 필요할 때만로드됩니다. 대신 System.Web.Compilation.BuildManagerGetReferencedAssemblies 메서드를 사용하여 참조 된 어셈블리의 목록을 가져 오십시오.참조 된 어셈블리를 강제해야

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>(); 

즉시 모듈 스캔이를 사용할 만드는 AppDomain에로드 할 수 있습니다.

+0

감사합니다. – Liel

1

마침내 문제의 원인을 발견했으며 실제로 IoC 컨테이너와 관련이 있습니다.

로컬로 문제를 재현하기 위해 (IIS Express 대신) 로컬 IIS 서버에 클라우드 서비스를 배포했습니다. 이제 WebSite를 중지/시작할 수 있으며 실제로 예외 스택 추적을 볼 수 있습니다.이 추적은 IoC의 등록되지 않은 어셈블리에 실제로 문제가 리얼리닝되었음을 증명했습니다.

분명히 응용 프로그램 풀이 재활용 될 때마다로드 된 모든 어셈블리가 지워지고 같은 규칙에 따라 다시로드되지 않습니다. 실제로 IoC가 다시 초기화되는 순간에로드되지 않은 어셈블리 (즉, 솔루션에서 약한 참조 된 프로젝트)를 발견했습니다.

이 지역의 배포에서 다르게 작동하는 이유는 잘 모르겠지만, 나는 호출하여 내 문제를 해결하기 위해 관리 :

Assembly.Load([Assembly Name]); 

IOC의를 초기화하기 전에.

관련 문제