[英]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.