我创建了一个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>
当 Controller 中发生异常时,
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
在不同的 namespace 中,但我认为这不相关)时,由于某种原因Server.GetLastError()
返回null,TempData为空,Session为空且Session.IsNewSession
为true。我试图通过让应用程序存储某种请求ID来解决该问题,但是这种情况似乎并不存在,现在我得到的最好的解决方案是,这种极其棘手的“通过请求IP来存储它,然后删除ErrorController收到后立即将其删除。”这(令人惊奇地)有效,但是必须有一个更安全,更可扩展的解决方案。我不确定为什么要清除TempData或为什么要重新启动Session-是因为错误,还是将其计为两个单独的请求?无论如何,是否有解决方法来获得所需的行为?
P.S.如果可能的话,我希望使用web.config中的
httpErrors
条目而不是Application_Error中的代码:似乎是一种更简洁,更具声明性的解决方案。P.P.S.我发现了一篇有关重定向期间Session对象问题的文章(link),但该问题已得到解决。我遇到的大多数其他事情都是关于较旧的
customErrors
系统的,但我将继续寻找。 最佳答案
MVC具有内置支持,可以处理异常并显示自定义 View 。默认情况下,MVC将HandleErrorAttribute
添加到RegisterGlobalFilters
文件中的Global.asax.cs
方法中。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
您需要将名为
Error
的 View 添加到Shared
View 文件夹。该 View 将具有HandleErrorInfo
类型的模型,该模型作为名为Exception
的属性来获取引发的异常@model System.Web.Mvc.HandleErrorInfo
@Model.Exception.Message