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

ehd*_*hdv 5 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>
Run Code Online (Sandbox Code Playgroud)

当控制器中发生异常时,BaseController.OnException会触发(BaseController是我自己创建的一类).我想在该函数中做的是存储异常,以便我的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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Era*_*nga 2

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

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
Run Code Online (Sandbox Code Playgroud)

您需要添加一个名为视图文件Error夹的视图Shared。该视图将具有一个类型模型,HandleErrorInfo该模型作为命名的属性Exception来获取引发的异常

@model System.Web.Mvc.HandleErrorInfo

@Model.Exception.Message
Run Code Online (Sandbox Code Playgroud)