2012-04-08 1 views
1

공유 호스팅 시스템에 ASP.Net 4.0 웹 사이트가 있습니다. 응용 프로그램은 20 분 동안 사용하지 않으면 재활용됩니다.공유 호스트 환경에서 어떤 시스템 구성 또는 오작동이 읽기 전용 정적 변수를 null로 만들 수 있습니까?

내 응용 프로그램에서 일부 정적 변수는 application_start에서 초기화됩니다.

다음 요청이 들어 오면 응용 프로그램을 다시 시작하고 application_start를 실행하고 정적 변수를 재설정해야합니다.

비활성 기간이 지나면 정적 변수에 의존하는 페이지에 액세스 할 때 null이고 오류가 발생합니다.

이러한 변수는 application_start에서 초기화되기 때문에 응용 프로그램을 다시 시작하면 초기화되지 않으므로 비활성 기간 이후에는 null이됩니다.

실제로 null 참조 오류가 표시되면 응용 프로그램 풀을 재활용하고 application_start를 실행하면 다음에 응용 프로그램을 메모리에서 삭제할 때까지 문제가 해결됩니다.

응용 프로그램이 단순히 재활용되는 경우 application_start에서 정적 변수를 다시 초기화하면 아무런 이유가 없으므로 메모리에서 응용 프로그램을 제거 할 때 다른 유형의 시스템 메모리 문제가 발생하는지 궁금합니다. 정체가 null 인 경우

정적 변수는 가비지 수집되지 않으므로 초기화 후에 null이 될 수 없습니다.

개발자 시스템에서는 오류가 발생하지 않으며 공유 호스팅 시스템에서만 발생합니다. application_start에서 초기화 된 정적 변수의 다른 원인은 무엇입니까?

변수를 다시 설정하는 코드가 없습니다. get 메소드를 통해서만 액세스를 포함하는 개인 필드입니다.

코드 :

비 활동 기간이 충족
private static List<State> stateList; 

public static void LoadStaticCache() 
{ 
    var service = DependencyResolver.Current.GetService<ILocationService>(); 
    stateList = service.GetAllStates().ToList(); 
} 

public static List<State> GetStates() 
{ 
    return stateList; 
} 

의 stateList에 액세스 할 때 다음에, 그것은 null입니다.

그러나 항상 application_start에서 초기화됩니다. 시스템 문제가 아니면 어떻게 null이 될 수 있습니까?

protected void Application_Start() 
    { 
     StaticCache.LoadStaticCache(); 
    } 

응용 프로그램 풀 재활용은 100 % 시간 문제를 해결합니다.

+0

공유 호스팅 시스템에 IIS의 어떤 버전을 실행? 버전 7.0 (통합 모드에서)부터는 Application_Start가 약간 다르게 동작합니다. – Dubs

+0

이 관련 질문은 도움이 될 수 있습니다 : http : // stackoverflow.com/questions/5261680/lifespan-of-net-public-static-variables 및이 http://forums.asp.net/t/1429625.aspx/1 – Dubs

+0

한 번 더 : http://stackoverflow.com/questions/5661202/static-field-in-asp-net-mvc – Dubs

답변

1

문제가 세션 시간 초과와 관련이있는 것 같습니다.

이전 버전의 IIS와 달리 호스트 된 서버가 통합 모드로 IIS 7.0 이상을 실행하는 경우 Application_Start는 아직 존재하지 않으므로 현재 HTTP 컨텍스트에 액세스 할 수 없습니다. 클래식 모드의 IIS 7.0에는 문제가 없습니다. 어느 경우

이 솔루션은 Global.asax에 년으로 session_start에 초기화를 이동하는 것입니다 :

//protected void Application_Start() 
//{ 
// StaticCache.LoadStaticCache(); 
//} 

protected void Session_Start(object sender, EventArgs e) 
{ 
    StaticCache.LoadStaticCache(); 
} 
관련 문제