3

我有一个 MVC 4 Web 应用程序。使用 ELMAH 和 Elmah.Contrib.WebApi,我的控制器或 API 控制器(或其底层服务)中发生的任何异常都会被完美记录。

我遇到麻烦的地方是手动记录错误。具体来说,在我的 Global.asax 中,我有很多初始化代码(设置 automapper 等)。为了捕捉初始化代码中可能发生的问题,我有以下内容:

 protected void Application_Start()
    {
        try
        {
            ControllerBuilder.Current.SetControllerFactory(new ErrorHandlingControllerFactory());
            GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
            GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute());

            AutoMapperConfiguration.Configure();
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();

            DatabaseConfig.Initialize();
            SecurityConfig.Initialize();
        }
        catch (Exception e)
        {
            var context = HttpContext.Current;
            var signal = ErrorSignal.FromContext(context);
            if (signal != null)
            {
                signal.Raise(e, context);
            }
        }
    }

ELMAH 永远不会记录在“catch”块内捕获的任何异常。然而,我知道 ELMAH 正在工作,因为从此时起,在任何控制器内将发生的任何其他异常都将被记录。因此,我已经排除了 web.config 等问题。

有什么建议么?谢谢。

4

2 回答 2

5

当 Applicaiton 正在执行其中的代码时,Application_Start它仍在初始化,并且没有处理任何 HttpRequest。

所以你的代码的问题是它HttpContext是空的。事实上,'ErrorSignal.FromContext(context);' 行会抛出一个ArgumentNullException.

但是,当没有 HttpContext 时,您仍然可以使用 Elmah(它基本上会记录错误消息和堆栈跟踪),如本问题所述。

所以你的收获是:

catch (Exception e)
{
    ErrorLog.GetDefault(null).Log(new Error(e));
}

希望能帮助到你!

于 2013-10-30T20:10:06.490 回答
0

我是 Elmah 的新手,但遇到了这样的事情:

catch (Exception ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
            return Json(string.Format("Failure: {0}", ex.Message), JsonRequestBehavior.AllowGet);
        }
于 2013-10-30T19:47:09.087 回答