繁体   English   中英

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

[英]Passing Exception to Custom Error Page using IIS7 httpErrors

我创建了一个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.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);
}

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

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

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

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

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

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

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

@model System.Web.Mvc.HandleErrorInfo

@Model.Exception.Message

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM