在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?
答案 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();
}
}