404,401和其他异常的ASP.NET MVC4错误处理

我很努力去理解如何正确处理ASP.NET MVC4中的错误。 例如,我使用“Internet应用程序”模板创建了一个新的MVC4项目,并更新了我的家用控制器以测试一些错误情况:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Hello";
        return View();
    }

    public ActionResult About()
    {
        throw new HttpException(401, "Not Authorized");
    }

    public ActionResult Contact()
    {
        throw new Exception("Oh no, some error occurred...");
    }
}

我在我的web.config文件中启用了customErrors:

<customErrors mode="On"></customErrors>

当我运行该应用程序并单击“联系人”时,我会看到〜/ Views / Shared / Error.cshtml视图,因为我将HandleErrorAttribute注册为全局过滤器。

但是,当我点击“关于”时,我会看到标准的ASP.NET黄色错误页面,其中显示“运行时错误”。 为什么这两个异常的处理方式不同,以及如何使用HandleError属性来获取HttpException实例?


CustomErrors配置

理想情况下,我想为下面的自定义错误页面:

  • 自定义404(未找到)页面,很好用户友好
  • 自定义401(未授权)页面,通知用户他们没有访问权限(例如在检查模型中特定项目的权限后抛出)
  • 在所有其他情况下使用的通用错误页面(代替标准的黄色ASP.NET页面)。
  • 我已经创建了一个新的“错误”控制器,其中包含以上每个场景的视图。 然后我更新了web.config中的customErrors,如下所示:

    <customErrors mode="On" defaultRedirect="~/Error/Trouble">
        <error statusCode="404" redirect="~/Error/NotFound"></error>
        <error statusCode="401" redirect="~/Error/NotAuthorized"></error>
    </customErrors>
    

    404页面正常工作,但我根本没有收到401页面 。 相反,当我尝试访问Home控制器上的About操作时,我得到了〜/错误/故障视图(指定为defaultRedirect视图)。

    为什么我的自定义401重定向页面不工作?


    ASP.NET在内部使用401将用户重定向到登录页面。 无论你打算抛出401未授权,而是抛出403禁止。


    如果你真的需要返回401而不是403,那么你可以使用:

    HttpContext.Current.Response.SuppressFormsAuthenticationRedirect = true
    

    我有一个类似的问题,即使更改了web.config,我仍无法获取401错误以访问我的页面。

    对于401,您可能会看到标准的401 Unauthorized页面,即使您已将401添加到web.config中的customerrors部分。 我读到,当使用IIS和Windows身份验证时,检查发生在ASP.NET甚至看到请求之前,因此您会看到它是自己的401。

    对于我的项目,我编辑了Global.asax文件以重定向到我为401错误创建的路线,并将用户发送到“未经授权查看此视图​​”。

    在Global.asax中:

        void Application_EndRequest(object sender, System.EventArgs e)
        {
            // If the user is not authorised to see this page or access this function, send them to the error page.
            if (Response.StatusCode == 401)
            {
                Response.ClearContent();
                Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults);
            }
        }
    

    并在Route.config中:

            routes.MapRoute(
            "ErrorHandler",
            "Error/{action}/{errMsg}",
            new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional }
            );
    

    并在控制器中:

        public ViewResult Unauthorised()
        {
            //Response.StatusCode = 401; // Do not set this or else you get a redirect loop
            return View();
        }
    
    链接地址: http://www.djcxy.com/p/71817.html

    上一篇: ASP.NET MVC4 error handling for 404, 401 and other exceptions

    下一篇: Send token with every backbone sync request