【问题标题】:ASP.NET MVC Custom Error Handling, Blank PageASP.NET MVC 自定义错误处理,空白页
【发布时间】:2016-04-10 19:32:29
【问题描述】:

我正在尝试处理错误并为 404、403 等显示适当的页面。

为此,我制作了一个 ErrorHandling 过滤器,它按预期工作。也就是说,当我尝试请求时

mysite.com/Home/random_non-existent_action

用户被重定向到我的自定义 404 页面并返回 404 作为响应代码。同样适用于 401 和 403。

我已经通过错误处理过滤器和 web.config 上的修改实现了这一点:

这就是问题的开始,我们的客户也想自定义 IIS 的错误页面,例如当我请求时

mysite.com/images,

显示 IIS 错误页面,因为目录浏览被禁用,并且因为在 IIS 级别被阻止,所以我的错误处理过滤器不起作用。

为了覆盖 IIS 错误页面,我在 web.config 中添加了以下代码

现在我的 web.config 中同时存在 customErrors 和 httpErrors, 当我请求时

mysite.com/Home/random_non-existent_action

显示了我的自定义 404 页面(因为它被 IIS 绕过并且我的错误处理过滤器有效)。但是当我要求

mysite.com/content

mysite.com/images

我收到带有 404 状态代码的空白响应。

当我将 responseMode 更改为 Redirect(而不是 ExecuteURL)时,它可以工作。但显然我正在尝试使用相对路径导航到我的自定义错误页面。

1-为什么我在尝试覆盖 IIS 自定义错误页面时得到空白响应?

2-为什么当我做出 responseMode="Redirect" 而不是 responseMode="ExecuteURL" 时它会起作用

任何帮助将不胜感激,因为我已经搜索了许多类似的 stackoverflow 主题但没有成功。

我已经尝试了所有现有响应和响应模式值的组合。除了 responseMode="Redirect" 之外的任何内容都会使其变为空白并显示相应的状态代码。

编辑:

我最后做的是,

使用 javascript 编写 html 内容并重定向到我的自定义错误页面。

【问题讨论】:

标签: asp.net-mvc error-handling iis-8 custom-error-pages custom-error-handling


【解决方案1】:

在 MVC 5 中,我遇到了同样的问题。我在 Global.asax 解决了处理这些错误的问题。将以下代码放入 Global.asax.cs。

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

        var routeData = new RouteData();
        routeData.Values.Add("area", "");
        routeData.Values.Add("controller", "SystemAdministration");

        if (exception.GetType() == typeof(HttpException))
        {
            var code = ((HttpException) exception).GetHttpCode();
            if (code == 404)
            {
                routeData.Values.Add("action", "NotFound");
            }
            else if (code == 403 || code == 401)
            {
                routeData.Values.Add("action", "NoAuthorization");
            }
            else
            {
                routeData.Values.Add("action", "Index");
                routeData.Values.Add("statusCode", code);
            }
        }
        else
        {
            routeData.Values.Add("action", "Index");
            routeData.Values.Add("statusCode", 500);
        }
        routeData.Values.Add("exception", exception);

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

希望这对你有用...

【讨论】:

  • Response.End();和 Response.TrySkipIisCustomErrors = true;在我的案例中,action 方法是关键。
猜你喜欢
  • 2010-11-13
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2010-12-07
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多