一劳永逸地,什么是处理错误、异常和404';s在MVC中
本文关键字:MVC 异常 什么 处理 错误 一劳永逸 | 更新日期: 2023-09-27 17:58:21
有很多关于SO和web的文章试图优雅地处理404和异常。
根据我所读到的,最好的建议似乎是有一条404的路线:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "ErrorController", action = "PageNotFound" }
);
然后,对于其他错误,请在控制器上设置HandleError
属性,并在web.config中打开CustomErrors,以便转到error.cshtml页面。
然而,我已经读到,如果您得到一个异常,没有将HTTP代码设置为500,那么HandleError将不起作用。
我们最终能否制定出一个解决404的/异常/ASP.Net错误的答案/最佳实践,并将其应用于我们的所有项目?
感谢
我使用了一个简单的错误处理设置。漂亮又简单。更多信息,请访问http://erictopia.com/2010/04/building-a-mvc2-template-part-7-custom-web-errors-and-adding-support-for-elmah/
安装ELMAH并让它处理所有错误。
接下来创建一个错误控制器。添加这样一条包罗万象的路线:
routes.MapRoute(
"ErrorHandler", // Route name
"{*path}", // URL
new { controller = "Error", action = "Index" }
);
然后在web.config中添加以下部分:
<customErrors mode="RemoteOnly" defaultRedirect="/Error/Index">
<error statusCode="403" redirect="/Error/NoAccess" />
<error statusCode="404" redirect="/Error/NotFound" />
</customErrors>
无需设置404路由。在全局asax应用程序启动中,设置一个全局过滤器来捕获404控制器存在但不存在操作的地方,或者如果操作返回404结果。
filters.Add(new HttpNotFoundFilterAttribute { Order = 99 });
其中筛选器是具有以下覆盖的ActionFilterAttribute:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result !=null &&
(filterContext.Result.GetType() == typeof(HttpNotFoundResult) )
{
//You can transfer to a known route for example
filterContext.Result = new TransferResult(SomeAction, SomeController);
}
}
在Application_Error中,如果不存在控制器:
Exception ex = Server.GetLastError();
string uri = null;
if (Context != null && Context.Request != null)
{
uri = Context.Request.Url.AbsoluteUri;
}
Exception baseEx = ex.GetBaseException();
var httpEx = ex as HttpException;
if ((httpEx != null && httpEx.GetHttpCode()==404)
|| (uri != null && Context.Response.StatusCode == 404) )
{ /* do what you want. */
//Example: show some known url
Server.ClearError();
Server.TransferRequest(transferUrl);
}
为了避免为静态资源处理404,您应该在Windows 7或Windows 2008 R2上安装SP1以升级IIS7并在web.config中设置:
...
<modules runAllManagedModulesForAllRequests="false">
...