【发布时间】:2017-07-14 20:10:49
【问题描述】:
我使用这篇文章Link 中的解决方案为我的应用程序拼接了一个错误处理。我遇到的问题是应用程序仍在路由到默认错误页面。当我断点代码时,代码一直到 Global.asax,但是当应该加载视图自定义错误页面时,它会从解决方案加载默认错误页面。我试图删除默认错误页面,然后我从 IIS 获得黄色错误页面。不知疲倦地在网上搜索,但没有结果。感谢所有的帮助。如果您认为我可以更好地调整问题或标题,我愿意接受建议。
错误控制器:
public class ErrorController : Controller
{
public ActionResult PageNotFound(Exception ex)
{
Response.StatusCode = 404;
return View("Error", ex);
}
public ActionResult ServerError(Exception ex)
{
Response.StatusCode = 500;
return View("Error", ex);
}
public ActionResult UnauthorisedRequest(Exception ex)
{
Response.StatusCode = 403;
return View("Error", ex);
}
//Any other errors you want to specifically handle here.
public ActionResult CatchAllUrls()
{
//throwing an exception here pushes the error through the Application_Error method for centralised handling/logging
throw new HttpException(404, "The requested url " + Request.Url.ToString() + " was not found");
}
}
Global.asax.cs 中的代码:
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
//Error logging omitted
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
IController errorController = new Controllers.ErrorController();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("area", "");
routeData.Values.Add("ex", exception);
if (httpException != null)
{
//this is a basic example of how you can choose to handle your errors based on http status codes.
switch (httpException.GetHttpCode())
{
case 404:
Response.Clear();
// page not found
routeData.Values.Add("action", "PageNotFound");
Server.ClearError();
// Call the controller with the route
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
break;
case 500:
// server error
routeData.Values.Add("action", "ServerError");
Server.ClearError();
// Call the controller with the route
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
break;
case 403:
// server error
routeData.Values.Add("action", "UnauthorisedRequest");
Server.ClearError();
// Call the controller with the route
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
break;
//add cases for other http errors you want to handle, otherwise HTTP500 will be returned as the default.
default:
// server error
routeData.Values.Add("action", "ServerError");
Server.ClearError();
// Call the controller with the route
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
break;
}
}
//All other exceptions should result in a 500 error as they are issues with unhandled exceptions in the code
else
{
routeData.Values.Add("action", "ServerError");
Server.ClearError();
// Call the controller with the route
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
RouteConfig.cs
routes.MapRoute("CatchAllUrls", "{*url}", new {controller = "Error", action = "CatchAllUrls"});
catch 块:
throw new HttpException(404, "Unable to write to list" + ", " + e.InnerException);
【问题讨论】:
-
您在 web.config 的
<system.web>部分中有<customErrors mode="On"/>吗? -
这是你的 ErrorController 执行了吗?我认为你应该重定向。见this article。
-
六种示例中哪一种最适合我?
-
@GeorgPatscheider 当我将
<customErrors mode="On"/>添加到<system.web>时。该页面变为空白,而不是 IIS 页面。 -
以下解决方案在不使用
Application_Error的情况下将自定义错误重定向到ErrorController:stackoverflow.com/questions/13905164/…另外看看这个关于常见陷阱的博客:benfoster.io/blog/aspnet-mvc-custom-error-pages
标签: c# asp.net-mvc custom-error-handling