Global.asax中的ASP.NET MVC Application_Error处理程序

时间:2013-06-02 15:11:09

标签: .net asp.net-mvc

在Global.asax中,我们有一个名为MvcApplication的System.Web.HttpApplication类 代表应用程序,我们可以在其中处理各种事件。

我对Application_Error处理程序感兴趣。 在这个处理程序中,我们可以使用类MvcApplication的所有属性。

-1 -

'(MvcApplication)发送者'和'this'是同一个对象,总是这样吗?

protected void Application_Error(object sender, EventArgs e)
{
  var httpApp = (MvcApplication)sender;
  var equality1 = httpApp == this; // always true?
}

-2 -

获得错误的最佳方法是什么? 以下示例返回相同的错误?

Exception ex0 = this.Context.Error;
Exception ex1 = httpContext.Error;
Exception ex2 = Server.GetLastError();
var equality3 = ex1 == ex2; // true?

2 个答案:

答案 0 :(得分:3)

protected void Application_Error(object sender, EventArgs e) {
  Exception exception = Server.GetLastError();
  Response.Clear();

  HttpException httpException = exception as HttpException;

  if (httpException != null) {
    string action;

    switch (httpException.GetHttpCode()) {
      case 404:
        // page not found
        action = "HttpError404";
        break;
      case 500:
        // server error
        action = "HttpError500";
        break;
      default:
        action = "General";
        break;
      }

      // clear error on server
      Server.ClearError();

      Response.Redirect(String.Format("~/Error/{0}/?message={1}", action, exception.Message));
    }

在你的控制器中:

// GET: /Error/HttpError404
public ActionResult HttpError404(string message) {
   return View("SomeView", message);
}

ASP.NET MVC Custom Error Handling Application_Error Global.asax?

答案 1 :(得分:3)

<强> Global.asax中

protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        Response.Clear();

        if (exception != null)
        {
            Common.WriteErrorLog(exception);
        }

        HttpException httpException = exception as HttpException;
        if (httpException != null)
        {
            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            switch (httpException.GetHttpCode())
            {
                case 404:
                    // page not found
                    routeData.Values.Add("action", "HttpError404");
                    break;
                case 500:
                    // server error
                    routeData.Values.Add("action", "HttpError500");
                    break;
                default:
                    routeData.Values.Add("action", "Index");
                    break;
            }
            routeData.Values.Add("error", exception.Message);
            // clear error on server
            Server.ClearError();

            Response.RedirectToRoute(routeData.Values);
            // at this point how to properly pass route data to error controller?
            //Response.Redirect(String.Format("~/Error/{0}/?message={1}", "Index", exception.Message));
        }
    }

控制器:

public class ErrorController : Controller
{
    // GET: Error
    public ActionResult Index(string error="")
    {
        ViewBag.Message = error;
        return View();
    }

    public ActionResult HttpError404(string error = "")
    {
        ViewBag.Message = error;
        return View();
    }

    public ActionResult HttpError500(string error = "")
    {
        ViewBag.Message = error;
        return View();
    }
}