如何处理应用程序启动时发生的 ASP.NET 应用程序错误以及 MVC 视图中的传输和显示错误?
Posted
技术标签:
【中文标题】如何处理应用程序启动时发生的 ASP.NET 应用程序错误以及 MVC 视图中的传输和显示错误?【英文标题】:How to handle ASP.NET application error that occurs on application start and transfer & display error in MVC view? 【发布时间】:2011-01-25 08:09:39 【问题描述】:我知道 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】:Request
和 Response
对象在您的 Application_Error
事件中是 null
的原因是因为 Application_Start
事件没有与任何用户关联,因此您不能从它重定向。只有Application
和Server
内置对象可用。引用 Session
、Request
或 Response
对象会导致错误。
一种解决方法是使用try/catch
并在catch
块中记录错误并设置一些全局变量以指示应用程序启动期间出现问题。稍后Application_BeginRequest
你可以检查这个变量并相应地重定向。
【讨论】:
我用来创建一些与您的答案相似的代码。当应用程序错误被触发并将最后一个错误保存到公共静态变量时,我会清除任何错误。之后,我有一些动作过滤器来检查这个变量并在它可用时显示错误。但是,我不喜欢这个主意。因为可能会向其他请求显示错误页面,导致此错误。 不应该有任何其他请求。如果您的应用程序在初始化时失败,我看不到它在失败状态下将如何处理任何请求。唯一的解决方法是解决问题并重新启动应用程序。 我同意如果出现启动错误,后续请求不应发生,因此您需要围绕所有 Application_Start 进行 try/catch。如果您在 BeginRequest 中检查启动异常,是否有比 Response.Redirect 更适合 MVC 的重定向方式?我的重定向方式是 Firefox 所说的不会结束。是否有某种方法可以重定向到发生异常的操作,例如 Error.Startup(ex)。 我已经记不清你的帖子有多少帮助了我。谢谢。以上是关于如何处理应用程序启动时发生的 ASP.NET 应用程序错误以及 MVC 视图中的传输和显示错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理应用程序级别的“值'0000-00-00'不能表示为java.sql.Timestamp”错误?