2013-04-29 2 views
5

사용자가 사이트를 방문 할 때 항상 "친숙한"오류 페이지를 보여주기 위해 Global.asax 페이지에서 catch-all을 사용합니다. 대부분의 오류는 선호되는 것으로 보이는 필터로 처리됩니다 방법. 대부분의 경우이 작동합니다. 그러나 Application_Start 동안 Application_Error 이벤트 (당연히) 트리거되지 않습니다.Global.asax Application_Start에서 어떻게 오류를 처리 할 수 ​​있습니까?

내 Application_Start 이벤트에는 서비스 호출에 종속적 인 초기화 코드가 포함되어 있으므로 쉽게 정의 할 수있는 장애 지점은 서비스가 어떤 이유에서든 사용할 수없는 경우입니다. 이 문제를 해결하기 위해 내가 찾은 유일한 방법은 다음을 수행하는 것입니다.

private static Exception StartUpException; 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     Initialise();  
    } 

    private void Initialise() 
    { 
     StartUpException = null; 
     try 
     { 
      Bootstrapper.Initialise(); 
     } 
     catch (Exception ex) 
     { 
      StartUpException = ex; 
     } 
    } 

는 다음 나는 Application_BeginRequest

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     if (StartUpException != null) 
     { 
      HandleErrorAndRedirect(StartUpException); 
      HttpRuntime.UnloadAppDomain(); 
      Response.End(); 
     } 
    } 

이 작동하지만 해킹의 비트처럼 보인다에서 다음과 같은 코드가 있습니다. UnloadAppDomain 호출의 결과에 대해 확신 할 수 없거나 여러 요청이 도착할 경우 발생할 수있는 상황에 대해 확신 할 수 없습니다. 이것을 관리하는 더 좋은 방법이 있습니까?

+0

'GlobalFilters.Filters'는'HandleError'를 포함합니까? 그렇다면 모든 오류를 포착합니다. – alexn

+0

아니요 제거하지 않았습니다. – DJG

+0

실례지만 내 application_start가 서비스에 의존하는 것은 분명히 [IMHO] 나쁜 행동일까요? 다른 곳으로 옮길 방법이 없습니까? 앱 시작이 약간 무거울 때! 또한 다음 요청이 들어 오면 app_start가 완료 될 때까지 기다렸다가 스레드를 픽업하거나 다른 App_Start를 호출하여 실패 할 것이라고 기대할 것입니다. –

답변

3

HttpContext가 설정되지 않았고 부트 스트랩 된 클래스 중 일부가 필요하기 때문에 App_Start에서 부트 스트래핑에 문제가 있습니다. 어쨌든 이것은 당신의 경우에도 잘 작동 할 것입니다 :

public class MvcApplication : System.Web.HttpApplication {  
    protected void Application_BeginRequest() { 
     var context = this.Context; 
     FirstTimeInitializer.Init(context); 
    } 

    private static class FirstTimeInitializer { 
     private static bool s_IsInitialized = false; 
     private static Object s_SyncRoot = new Object(); 

     public static void Init(HttpContext context) { 
      if (s_IsInitialized) { 
       return; 
      } 

      lock (s_SyncRoot) { 
       if (s_IsInitialized) { 
        return; 
       } 

       // bootstrap 

       s_IsInitialized = true; 
      } 
     } 
    } 
} 
관련 문제