C# 一劳永逸地说,处理错误、异常和404';MVC中的s
SO和web上有许多文章试图优雅地处理404和异常 据我所知,最好的建议似乎是为404提供一条路线,如下所示:C# 一劳永逸地说,处理错误、异常和404';MVC中的s,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,SO和web上有许多文章试图优雅地处理404和异常 据我所知,最好的建议似乎是为404提供一条路线,如下所示: routes.MapRoute( "404-PageNotFound", "{*url}", new { controller = "ErrorController", action = "PageNotFound" } ); 然后,对于其他错误,在控制器上设置HandleErroratribute,并在web.config中打开CustomError
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "ErrorController", action = "PageNotFound" }
);
然后,对于其他错误,在控制器上设置HandleError
atribute,并在web.config中打开CustomErrors,使其进入error.cshtml页面
然而,我已经读到,如果你得到一个异常,没有设置HTTP代码为500的HandleError将无法工作
我们能否最终生成一个答案/最佳实践来处理404的/Exceptions/ASP.Net错误,并将其应用于我们的所有项目
谢谢无需设置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);
}
}
在应用程序错误中,如果不存在控制器:
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">
...
。。。
...
我使用一个简单的错误处理设置。又好又简单。有关更多信息,请访问
安装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>
是否需要(在web.config文件中)customerrors=on?是否需要。此筛选器不是错误处理筛选器,将在任何错误筛选器之前调用-不会调用错误筛选器,因为代码正在将404结果变为其他结果。runAllMan…ts=false做什么?如。。哪些模块(或多个模块)真正被关闭?其次,使用新的传输结果(SomeAction,SomeController)
操作和控制器是您的错误控制器吗?1)with=true每个请求事件静态事件(jpg js,…)都通过路由管道。这是非常消耗cpu的,不是一个好的行为。对于false和SP1,只有映射的扩展和无扩展URL通过此管道。如果没有SP1,无扩展URL将绕过管道。在MVC中,您有许多无扩展URL,您必须确保配置正确。未通过管道的Http404遵守customError规则(并且仅遵守这些规则)和IIS中定义的规则(请参阅IIS中的404模块配置)。2) 是的,在我自己的情况下。这会在查询字符串中添加一些垃圾吗?类似于errorurl=/blah/foo之类的东西?问题是,默认情况下,您将捕获所有404,包括静态资源(图像、css等)。@Softion-这有什么错?如果一个浏览器要求一个不存在的图像,他们应该得到404,对吗?这与您的解决方案相比如何?你仍然需要处理404的静态资源。不,没有任何附加到querystring@Softion-这正是我想要的。这将使您的应用程序能够捕获那些在Joomla和Word Press中搜索漏洞的讨厌的俄罗斯机器人,然后自动将其IP地址列入黑名单。