使用这个问题的公认答案,我实现了自定义错误处理逻辑。它在我运行 Visual Studio 2012 的本地 PC 上运行良好,允许我为 403、404 和一般错误创建自定义视图。问题是当我将它部署到 Azure 时,IIS 开始显示错误消息,而不是我的 MVC 应用程序。我需要进行配置更改以允许 MVC 控制错误消息处理吗?
3 回答
虽然我不确定为什么我的 PC(带有 IIS Express 的 Windows 8)的默认设置不同,但是在部署到 Windows 2012 Server(IIS 8)时,您需要在 Web.config system.webServer 部分添加以下内容:
<httpErrors errorMode="Detailed" />
我会推荐一种与您引用的解决方案不同的解决方案。我对此有点生疏,但我记得设置起来相当简单。没有太多的代码或配置。这是我的配置的样子:
<!--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 时将不会部署它们。
希望有帮助!
问题是已部署版本中的默认错误处理程序覆盖了您的 Application_Error 逻辑。检查已部署并设置为 customErrors mode="On" 的 web.config 转换并设置适当的重定向。然后你需要禁用全局过滤器HandleError。注释掉 RegisterGlobalFilters 中的 HandleErrorAttribute 行。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
}