2013-04-29 11 views
5

ユーザーがサイトにアクセスしたときに常に「フレンドリーな」エラーページを表示するために、Global.asaxページのキャッチオールがあります。エラーの大部分は、優先されると思われるフィルタによって処理されます方法。ほとんどの場合、これは正常に動作します。ただし、Application_Startの間、Application_Errorイベント(当然)は起動されません。Global.asax Application_Startでエラーを処理するにはどうすればよいですか?

My 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; 
      } 
     } 
    } 
} 
関連する問題