我如何在ASP.NET MVC中使用Application_Error?

Pok*_*oku 17 asp.net error-handling asp.net-mvc

我想在我的MVC项目中使用Application_Error,但我不能让它工作.我将以下内容添加到我的Global.asax文件中:

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception objErr = Server.GetLastError().GetBaseException();
        Session["Test"] = "Message:" + objErr.Message.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

(会话仅用于测试.我将使用数据库记录错误,如果我让它工作.)然后我尝试从我的HomeController和我的Home/Index视图抛出异常,但它只触发调试.

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw (new Exception());
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

在我的Webconfig文件中,我设置了一个defaulterror页面,但它没有重定向到视图:

    <customErrors defaultRedirect="Home/Error">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
Run Code Online (Sandbox Code Playgroud)

blo*_*art 17

首先要记住,全局错误处理应该是最后的手段,并且控制器类具有错误的特定错误方法;

protected virtual bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception)
Run Code Online (Sandbox Code Playgroud)

在此范围内,您可以重定向到标准共享错误视图;

protected override bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception)
{
   RenderView("Error", exception);
   return false;
}
Run Code Online (Sandbox Code Playgroud)

您在全局应用程序错误中遇到的问题是它没有视图或控制器的概念,因此如果您想在那里重定向,那么您必须使用已知的URL

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    System.Diagnostics.Debug.WriteLine(exception);
    Response.Redirect("/Home/Error");
}
Run Code Online (Sandbox Code Playgroud)

你不需要这样做.如果在web.config中设置默认错误页面,则不需要该重定向

<customErrors defaultRedirect="Home/Error" />
Run Code Online (Sandbox Code Playgroud)

但是,除非您已将错误视图添加到不存在的Home控制器,因此请将以下内容添加到主控制器

public ActionResult Error()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

然后(如果你是明智的)你将错误处理代码放在Error()方法中,因为所有未处理的错误都将结束.

public ActionResult Error()
{
    Exception exception = Server.GetLastError();
    System.Diagnostics.Debug.WriteLine(exception);
    return View();
}
Run Code Online (Sandbox Code Playgroud)

最后请记住,默认情况下,如果要连接到localhost,则不会看到自定义错误!所以你需要改变这种行为

<customErrors mode="On" defaultRedirect="/Home/Error" />
Run Code Online (Sandbox Code Playgroud)

  • 嘿@blowdart:消息由一位无法发表评论的新用户提供:这个答案是错误的.问题是,如果使用web.config重定向到默认控制器操作,则从控制器类调用Server.GetLastError()不起作用.ASP向错误控制器发起新的HTTP请求,该请求清除服务器变量,丢失异常信息. (20认同)
  • 有权限的人需要解决这个问题.这个答案是不正确的,并且具有误导性. (6认同)
  • 错误答案..来自控制器类的Server.GetLastError()不起作用!! (5认同)
  • 糟糕的答案.....这里有一篇很好的文章,说明为什么你应该同时使用http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc (3认同)
  • 我对你的解决方案有疑问。CustomErrors 直接重定向到 Home/Errors 视图,而不触发控制器。我不知道这可能是什么,但是当我在错误操作方法上放置调试点时,永远不会调用调试。错误视图仅显示在屏幕上,但 url 仍然与触发错误的 URL 相同。例如,如果我在 /Home/Job 触发错误,我将获得错误视图,但 URL 仍然是 /Home/Job (2认同)