如何在 ASP.NET MVC 中使用 web.config customErrors
web.config 中 system.web
下的 <customErrors>
元素用于将错误代码配置到自定义页面。它可以用于为任何 4xx 或 5xx 错误代码配置自定义页面。但是,它不能用于记录异常或对异常执行任何其他操作。
当 ASP.NET MVC 应用程序发生异常时,如果从本地主机运行,它默认会显示以下屏幕(黄色死亡屏幕),其中显示错误信息。
当您在 Visual Studio 中创建 MVC 应用程序时,它不会开箱即用地实现任何异常处理技术。当发生异常时,它将显示一个错误页面。
例如,考虑以下抛出异常的动作方法。
namespace ExceptionHandlingDemo.Controllers
{
public class HomeController : Controller
{
public ActionResult Contact()
{
string msg = null;
ViewBag.Message = msg.Length; // this will throw an exception
return View();
}
}
现在,在浏览器中导航到 /home/contact
,您将看到以下黄色页面(也称为黄色死亡屏幕),其中显示了异常详细信息,例如异常类型、发生异常的行号和文件名以及堆栈跟踪。

所有未处理的异常都应该被处理,并向用户显示有意义的消息,而不是错误信息。我们可以使用 web.config 文件的 <customErrors>
部分来渲染或重定向到自定义页面。
第一步是使用其模式属性启用 customErrors,该属性可以具有以下三个值之一
On:指定启用自定义错误。如果未指定 defaultRedirect,用户会看到一个通用错误页面,例如 ASP.NET MVC 应用程序中的 Error.cshtml。
Off:指定禁用自定义错误。这将显示详细错误。
RemoteOnly:指定仅向远程客户端显示自定义错误,并向本地主机显示 ASP.NET 错误。这是默认值。
我们将使用 Mode=On 在本地主机上进行测试。理想情况下,我们应该使用 RemoteOnly。
<system.web>
<customErrors mode="On"></customErrors>
</system.web>
您还需要在 FilterConfig.cs
文件中添加 HandleErrorAttribute
过滤器。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
启用 customErrors 模式为 On 后,ASP.NET MVC 应用程序将显示默认的自定义错误页面,如下所示。

惊讶!它是如何显示上述页面的,从哪里来的?
好吧!它已经从 Shared 文件夹渲染了 Error.cshtml 视图。HandleErrorAttribute 过滤器在 ASP.NET MVC 中设置了这个默认错误视图。
通过按 F12(在 Chrome 中)并在开发人员控制台中刷新页面,检查响应的状态码。您将看到它已响应状态码 500。

此设置将仅显示 500 级错误的自定义页面,而不显示其他错误代码的自定义页面。
使用 defaultRedirect
指定当发生错误时,HTTP 请求应默认重定向到哪里。您可以指定 webform、HTML 或动作方法的名称。这将在任何错误代码(不仅仅是 500)下重定向到此页面。
如果您使用 defaultRedirect
属性,则必须删除 HttpErrorHandler
过滤器。否则,它将重定向到默认的 Error.cshtml 页面,而不是配置的页面。
例如,以下配置将在任何 5xx 或 4xx 异常时显示自定义 webform Error.aspx 页面。
<system.web>
<customErrors mode="On" defaultRedirect="Error.aspx" >
</customErrors>
</system.web>
以下配置将在任何 5xx 或 4xx 异常时显示自定义 HTML 页面 Error.html。
<system.web>
<customErrors mode="On" defaultRedirect="Error.html" >
</customErrors>
</system.web>
当发生异常时,您还可以重定向到控制器的动作方法。以下设置将重定向到 MVC 应用程序中 ErrorController 的 Index 动作方法。
<system.web>
<customErrors mode="On" defaultRedirect="/error" >
</customErrors>
</system.web>
上述设置将在浏览器中显示以下结果。

请注意,所有自定义错误页面都返回状态码 200,并且 URL 包含 ?aspxerrorpath=
查询字符串,该查询字符串指向原始请求的页面或动作方法。
您还可以使用子 <error>
元素为不同的错误代码设置不同的动作方法或页面。以下为不同的错误代码设置不同的动作方法。
<customErrors mode="On" defaultRedirect="/error" >
<error statusCode="400" redirect="/error/badrequest" />
<error statusCode="404" redirect="/error/notfound" />
<error statusCode="500" redirect="/error/internalerror" />
</customErrors>
当然,您必须创建所有上述动作方法及其视图。当导航到不存在的页面 /home/test
时,上述设置将显示以下结果。

如您所见,当显示自定义错误页面时,URL 包含查询字符串 ?aspxerrorpath
。您可以使用 redirectMode 属性保留原始 URL。
redirectMode
如果您希望保留原始 URL 而不带 ?aspxerrorpath
查询字符串,请使用 redirectMode
属性。默认情况下,它将 redirectMode 设置为 ResponseRedirect,这就是当发生异常时 URL 会更改的原因。
将 redirectMode
属性设置为 ResponseRewrite
。这将保留原始 URL,但仍显示自定义页面。请注意,ResponseRewrite 仅适用于 .aspx 或 .html 文件,而不适用于动作方法。如果要为不同的状态码设置动作方法,请保留 ResponseRedirect
值。
以下为不同的状态码设置不同的 HTML 文件,并将 redirectMode
设置为 ResponseRewrite
。
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/500.html" >
<error statusCode="500" redirect="~/500.html" />
<error statusCode="404" redirect="~/404.html" />
<error statusCode="400" redirect="~/400.html" />
</customErrors>
在应用程序的根目录中创建 500.html、404.html 和 400.html 文件。上述设置将保留原始 URL,不带查询字符串,同时显示 HTML 页面的内部内容,响应状态码为 200 OK。

因此,您可以使用 web.config 中的 <customErrors>
部分在 ASP.NET webform 或 MVC 应用程序中发生异常时显示自定义页面。
<customErrors>
配置将始终返回状态码为 200 的响应。这对于网站来说不是一个好的 SEO 实践。了解如何在 ASP.NET MVC 中使用 httpErrors 显示自定义错误页面并返回错误代码。