使用IIS7 httpErrors将异常传递给自定义错误页面

时间:2011-12-15 04:37:36

标签: c# asp.net-mvc asp.net-mvc-3

我创建了一个ASP.NET MVC 3应用程序,使用httpErrors来处理向用户显示错误消息等。该代码工作正常,并在下面重复。

<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" errorMode="Custom">
  <clear/>
  <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL"/>
  <error statusCode="404" subStatusCode="-1" path="/Error/NotFound" responseMode="ExecuteURL"/>
  <error statusCode="500" subStatusCode="-1" path="/Error/ServerError" responseMode="ExecuteURL"/>
</httpErrors>

当控制器中发生异常时,会触发BaseController.OnExceptionBaseController是我自己创建的一类)。我想在该函数中做的是存储异常,以便我的ServerError操作可以查看其类型和消息,以确定要向用户显示的内容。整个方法复制如下。

protected override void OnException(ExceptionContext filterContext)
{
    // doesn't work
    this.TempData["exception"] = filterContext.Exception;

    // doesn't work
    this.Session["exception"] = filterContext.Exception;

    // temporary hack
    ErrorController.RequestExceptions[this.Request.UserHostAddress] = filterContext.Exception;
    base.OnException(filterContext);
}

当请求到达ErrorController实例(ErrorController在不同的命名空间中,但我认为不相关时),由于某种原因Server.GetLastError()返回null,TempData是为空,Session为空,Session.IsNewSession为真。我尝试通过让应用程序存储某种请求ID来解决这个问题,但这似乎并不存在,而且现在我得到的最好的解决方案是这个非常hacky“通过请求IP存储它,然后删除一旦ErrorController拿起它就会它。“

这(令人惊讶的)有效,但必须有一个更安全,更具伸缩性的解决方案。我不确定为什么TempData被清除或为什么会话重启 - 是因为错误,还是算作两个单独的请求?无论如何,是否有解决方法来获得所需的行为?

P.S。如果可能的话,我希望在web.config中使用httpErrors条目而不是Application_Error中的代码:它看起来像一个更清晰,更具声明性的解决方案。

P.P.S。我在重定向(link)期间发现了一篇关于Session对象问题的文章,但它说问题已得到解决。我遇到的大多数其他事情都是关于较旧的customErrors系统,但我会继续寻找。

1 个答案:

答案 0 :(得分:2)

MVC内置支持处理异常并显示自定义视图。默认情况下,MVC将HandleErrorAttribute添加到RegisterGlobalFilters文件中的Global.asax.cs方法。

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

您需要将名为Error的视图添加到Shared视图文件夹中。该视图将具有类型为HandleErrorInfo的模型,该模型作为名为Exception的属性来获取抛出的异常

@model System.Web.Mvc.HandleErrorInfo

@Model.Exception.Message