我创建了一个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被清除或为什么会话重启 - 是因为错误,还是算作两个单独的请求?无论如何,是否有解决方法来获得所需的行为?
P.S。如果可能的话,我希望在web.config中使用httpErrors
条目而不是Application_Error中的代码:它看起来像一个更清晰,更具声明性的解决方案。
P.P.S。我在重定向(link)期间发现了一篇关于Session对象问题的文章,但它说问题已得到解决。我遇到的大多数其他事情都是关于较旧的customErrors
系统,但我会继续寻找。
答案 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