4

重複の可能性:
elmah:HttpContextのない例外?

Global.asax

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
        throw new Exception("TEST");
    }


    // ... other usual methods
}

Elmah例外をログに記録していません。

私はここでかなりの初期化と構成作業を行っています。何か問題が発生した場合にエラーログを取得することが重要です。

なぜそれが機能しないのかはわかりませんが、おそらくMVCライフサイクルに関係しています-おそらくHttpContextこの段階ではありませんか?ここからエラーをログに記録する方法はありますElmahか?

4

1 に答える 1

1

あなたは間違いなく1つのことについて正しいですが、にHttpContext.Currentは存在しませんApplication_Start。これはおそらく、Elmahがそのメソッドからのエラーをログに記録しない理由の1つです。

ただし、Application_Startに例外がある場合は、Elmahが例外をログに記録しないよりも大きな問題が発生します。メソッドは完璧である必要があります。Application_Startそうでない場合は、開発環境で失敗するように記述して、本番環境にプッシュする前に問題を確認できるようにする必要があります。断続的な例外である場合は、問題のコードを別の場所に配置することをお勧めします。

アップデート

あなたのコメントに基づいて、多分これはあなたのために働くでしょう。また、すべてのリクエストをチェックして、最初に失敗したかどうかを確認するという追加の利点もあります。

protected void Application_BeginRequest(object sender, EventArgs args)
{
  CheckConfiguration();
}

private static readonly object ConfigurationLockObject = new object();
private void CheckConfiguration()
{
  /** Lock Bypass **/
  if (IsConfigured()) 
  {
    return;
  }

  // The lock ensures the configuration only gets called one at a time.
  lock (ConfigurationLockObject)
  {
    // Must check for configuration again, just in case multiple threads had hit the lock
    if (!IsConfigured())
    {
      try
      {
        // Configuration Code
      }
      catch (Exception exception)
      {
        Log.Error("Exception Occurred", exception);
      }
    }
  }
}
于 2011-07-13T15:02:38.437 に答える