4

使用这个问题的公认答案,我实现了自定义错误处理逻辑。它在我运行 Visual Studio 2012 的本地 PC 上运行良好,允许我为 403、404 和一般错误创建自定义视图。问题是当我将它部署到 Azure 时,IIS 开始显示错误消息,而不是我的 MVC 应用程序。我需要进行配置更改以允许 MVC 控制错误消息处理吗?

4

3 回答 3

5

虽然我不确定为什么我的 PC(带有 IIS Express 的 Windows 8)的默认设置不同,但是在部署到 Windows 2012 Server(IIS 8)时,您需要在 Web.config system.webServer 部分添加以下内容:

<httpErrors errorMode="Detailed" />
于 2013-01-08T16:53:52.903 回答
1

我会推荐一种与您引用的解决方案不同的解决方案。我对此有点生疏,但我记得设置起来相当简单。没有太多的代码或配置。这是我的配置的样子:

<!--This is the catch all error page.  All these views are located in project directory Views/Shared -->
<customErrors mode="On" defaultRedirect="~/error/Error">
   <!--Custom 404-->
  <error statusCode="404" redirect="~/error/Notfound"></error>
  <!--Custom 401-->
  <error statusCode="401" redirect="~/error/NotAuthorized"></error>
</customErrors>

如果您想添加自定义/通用错误日志记录,请尝试创建您自己的 HandleErrorAttribute。使用继承并覆盖 OnException 方法。像这样的东西:

public class CustomErrorHandler : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        //your logging code here

        base.OnException(filterContext);
    }
}

您还可以捕获异常并让它们为您显示自定义错误页面。在我的应用程序中,我使用它来自定义我的 401。这是我的 Global.cs RegisterGlobalFilters 的样子:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomErrorHandler 
                        {
                            ExceptionType = typeof(NotAuthorizedHttpException),
                            View = "NotAuthorized",
                            Order = 2
                        });

        //Leave this line uncommented to let your customer error handler
        filters.Add(new CustomErrorHandler ()); 
    }

我不必为此工作注册任何特殊路线。最后一个警告。确保您的错误页面包含在您的项目中,否则在您发布到 Azure 时将不会部署它们。

希望有帮助!

于 2013-01-08T13:59:04.930 回答
0

问题是已部署版本中的默认错误处理程序覆盖了您的 Application_Error 逻辑。检查已部署并设置为 customErrors mode="On" 的 web.config 转换并设置适当的重定向。然后你需要禁用全局过滤器HandleError。注释掉 RegisterGlobalFilters 中的 HandleErrorAttribute 行。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //filters.Add(new HandleErrorAttribute());
}
于 2013-01-08T02:44:29.890 回答