Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一劳永逸地说,处理错误、异常和404';MVC中的s_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 一劳永逸地说,处理错误、异常和404';MVC中的s

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

SO和web上有许多文章试图优雅地处理404和异常

据我所知,最好的建议似乎是为404提供一条路线,如下所示:

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地址列入黑名单。