自定义错误适用于HttpCode 403但不适用于500?

时间:2012-04-20 15:01:32

标签: asp.net-mvc-3 custom-errors

我正在我的MVC3应用程序中实现自定义错误,它在web.config中打开:

<customErrors mode="On">
  <error statusCode="403" redirect="/Errors/Http403" />
  <error statusCode="500" redirect="/Errors/Http500" />
</customErrors>

我的控制器非常简单,具有相应的正确命名视图:

public class ErrorsController : Controller
{
    public ActionResult Http403()
    {
        return View("Http403");
    }

    public ActionResult Http500()
    {
        return View("Http500");
    }
}

为了测试,我在另一个控制器中抛出异常:

public class ThrowingController : Controller
{
    public ActionResult NotAuthorised()
    {
        throw new HttpException(403, "");
    }

    public ActionResult ServerError()
    {
        throw new HttpException(500, "");
    }
}

403工作 - 我被重定向到我的自定义“/ Errors / Http403”。

500不起作用 - 我被重定向到共享文件夹中的默认错误页面。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

除了标准的customErros配置之外,我还使用httpErrors来启动和运行500个错误:

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

从global.asax

中删除这一行
GlobalFilters.Filters.Add(new HandleErrorAttribute());

然而,它并不完美,因为我正在尝试检索始终为null的最后一个错误。

Server.GetLastError()

请参阅https://stackoverflow.com/a/7499406/1048369,了解MVC3中有关自定义错误的最全面的内容,我发现这些内容非常有用。

答案 1 :(得分:0)

我遇到了同样的问题,在这种情况下我直接在Global.asax中捕获了Exception:

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

            Response.Clear();



            HttpException httpException = exception as HttpException;

            var code = httpException == null ? 500 : httpException.GetHttpCode();

            // Log the exception.
            if (code == 500)
                logError.Error(exception);

            Server.ClearError();

            Context.Items["error"] = code;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            routeData.Values.Add("action", "Index");
            routeData.Values.Add("code", code);

            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));

        }

重定向到我的自定义错误500:/错误/索引?代码= 500