如何处理在应用程序启动和传输时发生的ASP.NET应用程序错误&在MVC视图中显示错误?

时间:2010-03-09 08:29:49

标签: asp.net asp.net-mvc error-handling

我知道ASP.NET MVC有错误过滤器属性来处理指定的错误类型。但是,此功能无法捕获应用程序启动时发生的任何错误。因此,我需要在“Application_Error”方法中添加一些代码来处理此错误,如下面的代码所示。

public void Application_Error(object sender, EventArgs e)
{
    // At this point we have information about the error
    var ctx = HttpContext.Current;

    var exception = ctx.Server.GetLastError();

    var errorInfo =
       "<br>Offending URL: " + ctx.Request.Url +
       "<br>Source: " + exception.Source +
       "<br>Message: " + exception.Message +
       "<br>Stack trace: " + exception.StackTrace;

    ctx.Response.Write(errorInfo);

    Server.ClearError();
}

虽然,当发生正常的应用程序错误(如视图页面中发生的错误)时,此代码将正常工作。但是,当应用程序启动时发生错误时它不起作用,因为请求和响应对象始终为空。

接下来,我尝试通过在自定义错误中设置默认重定向来解决此问题,如下面的代码。

<customErrors mode="On" defaultRedirect="Scripts/ApplicationError.htm"></customErrors>

不幸的是,它不起作用,因为当应用程序收到重定向请求时,它会再次尝试启动应用程序并再次抛出异常。

如何解决这个问题?或者,您是否有其他想法来处理此错误。

谢谢,

PS。创建此处理程序的主要原因是因为我想在应用程序无法连接到其他服务(如数据库)以便在应用程序启动时缓存数据时显示错误。

1 个答案:

答案 0 :(得分:19)

Request事件中Responsenull个对象Application_Error的原因是因为Application_Start事件未与任何用户相关联,因此您无法从中重定向。只有ApplicationServer内置对象可用。引用SessionRequestResponse对象会导致错误。

一种解决方法是使用try/catch并在catch块中记录错误并设置一些全局变量,指示在应用程序启动期间出现问题。稍后在Application_BeginRequest,您可以检查此变量并相应地重定向。