我有一些基本代码来确定我的MVC应用程序中的错误。目前在我的项目,我有一个名为控制器Error与操作方法HTTPError404(),HTTPError500()和General()。它们都接受字符串参数error。使用或修改下面的代码。将数据传递给错误控制器进行处理的最佳/正确方法是什么?我想有一个尽可能强大的解决方案。
Error
HTTPError404()
HTTPError500()
General()
error
protected void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); Response.Clear(); 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", "General"); break; } routeData.Values.Add("error", exception); // clear error on server Server.ClearError(); // at this point how to properly pass route data to error controller? } }
无需为此创建新路由,您只需重定向到控制器/操作并通过querystring传递信息即可。例如:
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管道来处理404,因此将为所有这些匹配创建会话对象。对于频繁使用的系统,这可能是一个问题(性能)。