我已经实现了以下链接中提到的异常处理
How to pass error message to error view in MVC 5?
它工作正常.但我要求处理404错误.
我怎样才能做到这一点?
如果我使用下面的代码,
<customErrors mode="On"> <error statusCode="404" redirect="/Home/Error"></error> </customErrors>
当发生任何404错误时,它可以正常工作.但是如果发生任何其他异常,那么我的error.cshtml调用两次并显示相同的异常两次.
解决方法@H_404_16@
web.config中
<system.web>
<customErrors mode="Off" />
</system.web>
在system.webServer中配置http错误
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto">
<clear />
<error statusCode="404" responseMode="ExecuteURL" path="/NotFound" />
<error statusCode="500" responseMode="ExecuteURL" path="/Error" />
</httpErrors>
</system.webServer>
创建简单的错误控制器来处理这些请求ErrorContoller.cs
[AllowAnonymous]
public class ErrorController : Controller {
// GET: Error
public ActionResult NotFound() {
var statusCode = (int)System.Net.HttpStatusCode.NotFound;
Response.StatusCode = statusCode;
Response.TrySkipIisCustomErrors = true;
HttpContext.Response.StatusCode = statusCode;
HttpContext.Response.TrySkipIisCustomErrors = true;
return View();
}
public ActionResult Error() {
Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
Response.TrySkipIisCustomErrors = true;
return View();
}
}
配置路由RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes) {
//...other routes
routes.MapRoute(
name: "404-NotFound",url: "NotFound",defaults: new { controller = "Error",action = "NotFound" }
);
routes.MapRoute(
name: "500-Error",url: "Error",action = "Error" }
);
//..other routes
//I also put a catch all mapping as last route
//Catch All InValid (NotFound) Routes
routes.MapRoute(
name: "NotFound",url: "{*url}",action = "NotFound" }
);
}
最后确保您拥有控制器操作的视图
Views/Shared/NotFound.cshtml
Views/Shared/Error.cshtml
<system.web> <customErrors mode="Off" /> </system.web>
在system.webServer中配置http错误
<system.webServer> <httpErrors errorMode="Custom" existingResponse="Auto"> <clear /> <error statusCode="404" responseMode="ExecuteURL" path="/NotFound" /> <error statusCode="500" responseMode="ExecuteURL" path="/Error" /> </httpErrors> </system.webServer>
创建简单的错误控制器来处理这些请求ErrorContoller.cs
[AllowAnonymous] public class ErrorController : Controller { // GET: Error public ActionResult NotFound() { var statusCode = (int)System.Net.HttpStatusCode.NotFound; Response.StatusCode = statusCode; Response.TrySkipIisCustomErrors = true; HttpContext.Response.StatusCode = statusCode; HttpContext.Response.TrySkipIisCustomErrors = true; return View(); } public ActionResult Error() { Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; Response.TrySkipIisCustomErrors = true; return View(); } }
配置路由RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes) { //...other routes routes.MapRoute( name: "404-NotFound",url: "NotFound",defaults: new { controller = "Error",action = "NotFound" } ); routes.MapRoute( name: "500-Error",url: "Error",action = "Error" } ); //..other routes //I also put a catch all mapping as last route //Catch All InValid (NotFound) Routes routes.MapRoute( name: "NotFound",url: "{*url}",action = "NotFound" } ); }
最后确保您拥有控制器操作的视图
Views/Shared/NotFound.cshtml Views/Shared/Error.cshtml