5

我在我的 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 不起作用 - 我被重定向到共享文件夹中的默认错误页面。

有任何想法吗?

4

2 回答 2

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());

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

Server.GetLastError()

请参阅https://stackoverflow.com/a/7499406/1048369,了解我发现的关于 MVC3 中自定义错误的最全面的文章,这对我很有帮助。

于 2012-04-22T13:13:48.417 回答
0

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

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:/Error/Index?code=500

于 2012-04-20T15:09:04.813 回答