无法重定向到自定义错误页面

时间:2014-03-07 18:18:10

标签: c# asp.net-mvc iis asp.net-mvc-5

我正在尝试在出现错误时重定向到自定义页面。所以我在Web.Config添加了以下代码

    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/Error500.cshtml">
          <error statusCode="404" redirect="~/Views/Error/Error404"/>
          <error statusCode="500" redirect="~/Views/Error/Error500"/>
    </customErrors>
  </system.web>
    <system.webServer>
        <httpErrors errorMode="Custom" existingResponse="Replace">
          <remove statusCode="404" subStatusCode="-1" />
          <error statusCode="404" path="~/Views/Error/Error404" responseMode="ExecuteURL" />
          <remove statusCode="500" subStatusCode="-1" />
          <error statusCode="500" path="~/Views/Error/Error500" responseMode="ExecuteURL" />
        </httpErrors>

但是当我尝试localhost:23920 / aFakeURl时,它会将我重定向到一个空白页面,但它没有到达我的ErrorController

如果我尝试localhost:23920 / Error / Error404它会进入我的控制器

// GET: /Error/Error404
public ActionResult Error404()
{
   Response.StatusCode = 404;
   return View();
}

然后它返回statusCode 404,IIS不知道如何处理它,它给了我一个空白页面。所以我很确定问题是Web.Config中的路径。

我试过

  • ~/Views/Error/Error404"
  • ~/Views/Error/Error404.cshtml"
  • /Views/Error/Error404"
  • /Views/Error/Error404.cshtml"

值得一提的是,当路径没有~时,它会返回运行时异常而不是空白页。

所以我有2个问题。

  1. Web.Config的正确方法是什么?
  2. 我应该像这样返回正确的状态代码吗? Response.StatusCode = 404;中的ErrorController
  3. 谢谢

    我不知道是否提及,但我使用Elmah进行错误处理和记录。不知道它是否与此问题有关,但我在他们的文档中读到它应该与mode="On"一起使用。有没有更好的方法来处理这一切?

    修改

    现在我用这个

        <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/Error/Error500">
          <error statusCode="404" redirect="/Error/Error404"/>
          <error statusCode="500" redirect="/Error/Error500"/>
        </customErrors>
      </system.web>
      <system.webServer>
        <httpErrors errorMode="Custom" existingResponse="Replace">
          <remove statusCode="404" subStatusCode="-1" />
          <error statusCode="404" path="/Error/Error404" responseMode="ExecuteURL" />
          <remove statusCode="500" subStatusCode="-1" />
          <error statusCode="500" path="/Error/Error500" responseMode="ExecuteURL" />
        </httpErrors>
    

    但是当我输入错误的网址时,它总是返回错误500.

    例外是System.Web.HttpException: The controller for path '/aBadUrllllll' was not found or does not implement IController.

    为什么这不会返回404错误?

    我是否必须更改Route.config中的内容?

2 个答案:

答案 0 :(得分:1)

可以放置标签: 您还需要指定常规错误代码和页面,如下所示:

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Auto">
      <remove statusCode="403" subStatusCode="14"/>
      <error statusCode="403" subStatusCode="14" responseMode="ExecuteURL"
path="/App/Error/Forbidden"/>
      <remove statusCode="404"/>
      <error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound"/>
    </httpErrors>... 

请记住在控制器错误中创建页面NotFound!

答案 1 :(得分:0)

我遇到了类似的问题,最终通过确保我做了以下所有事情来解决问题:

1)customErrors mode =&#34; On&#34;已在web.config中设置

2)创建了一个ErrorController,其中包含针对需要自定义错误页面的特定错误的操作。

e.g。

    [AllowAnonymous]
    public virtual ActionResult NotFound(string message = "")
    {
        HttpContext.Response.StatusCode = 404;
        return View();
    }

3)创建了一个Filter.config文件来添加HandleErrorAttribute,并在global.asax的app start中调用此方法。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

4)在global.asax中添加了全局错误处理程序。这是一个不完整的样本。

    void Application_Error(object sender, EventArgs e)
    {
        var exception = Server.GetLastError();
        Response.Clear();

        var httpException = exception as HttpException;

        if (httpException != null)
        {
            var action = string.Empty;

            switch (httpException.GetHttpCode())
            {
                case 401:
                    action = "Unauthorized";
                    break;
                case 403:
                    action = "Forbidden";
                    break;
                case 404:
                    action = "NotFound";
                    break;
                case 500:
                    action = "ServerError";
                    break;
                default:
                    action = "ServerError";
                    break;
            }

            Server.ClearError();

            Response.Redirect(string.Format("~/Error/{0}/?message={1}", action, exception.Message));
        }

        Logger.Error("Unhandled website exception", exception);
    }

有了这一切,那么硬性异常也将得到妥善处理和有意重定向。例如,如果在登录时未达到业务规则而导致用户无法继续操作,则完成此操作。

返回RedirectToAction(&#34;未经授权&#34;,&#34;错误&#34;,新{message =&#34;您的帐户无法使用此功能。&#34;});

但是,有一条建议是,返回401错误最终不会显示错误页面并将您带到登录页面,除非您正确处理它。我确信在其他一些帖子中有解释。

另外一件事,我刚刚在Dev和UAT环境中部署了最新版本时就发现了这一点。在我的本地IIS中,我看到自定义错误页面很好,但在其他环境中它显示了默认的IIS页面。路由到我的ErrorController工作得很好,但自定义页面仍未显示。结果我需要这个web.config条目

httpErrors existingResponse =&#34; PassThrough&#34;

在system.webServer下,现在有意义。