无法在MVC应用中的HTTP 403上显示自定义错误页面

时间:2015-02-03 14:57:39

标签: asp.net-mvc

我在MVC应用程序的Global.asax.cs文件中有以下代码,它捕获500和404错误并调用我的ErrorsController,它根据代码返回我的自定义错误页面。这很好用。但是这段代码也应该捕获403错误(未经授权),这样我的控制器也会显示正确的视图。但是当我运行它时,我得到一个IIS页面,说明未经授权的消息。如何让我的代码调用我的ErrorsController,接收403代码,并显示我的自定义视图?

我测试它的方式是我在我的一个动作上放置了[Authorize]属性并调用了该动作。我应该收到403错误,并且应该显示我的自定义错误页面。

protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        Server.ClearError();

        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Errors");
        routeData.Values.Add("action", "Feedback");
        routeData.Values.Add("exception", exception);

        if (exception.GetType() == typeof(HttpException))
        {
            routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
        }
        else
        {
            routeData.Values.Add("statusCode", 500);
        }

        IController controller = new ErrorsController();
        controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        Response.End();
    }

1 个答案:

答案 0 :(得分:0)

当您使用Authorize属性时,授权失败时不会触发应用程序错误,它只会返回HttpResponseMessage。这就是它没有按预期工作的原因(并且它不应该像你期望的那样工作)。

这个带有自定义错误页面的内容在.Net MVC中有点乱,但我建议您查看HttpErrors或制作自己的自定义HttpModule来检查传出响应的状态并采取在那里采取适当的行动。