Asp.net mvc 3 Asp.Net MVC应用程序启动时出现Elmah日志错误
可能重复:Asp.net mvc 3 Asp.Net MVC应用程序启动时出现Elmah日志错误,asp.net-mvc-3,elmah,httpcontext,error-logging,application-start,Asp.net Mvc 3,Elmah,Httpcontext,Error Logging,Application Start,可能重复: 在Global.asax中 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(Rou
在
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
在这里记录错误?关于HttpContext这一点,您肯定是对的。当前的不存在于应用程序\u Start
中,这可能是Elmah不记录该方法错误的原因之一
但是,如果您在Application_Start中出现异常,那么您将遇到比Elmah更大的问题—不记录异常。您的Application\u 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);
}
}
}
}
Application_Start是初始化IOC容器的地方,需要从配置文件中读取。我同意这是一个不好的地方,有潜在的异常生成代码,但我想不出任何方法来解决它。这涵盖了与相同的领域,它有一个比这里更好的答案。