我创建了一个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

10-05 23:01
查看更多