如果您在设置ASP.NET MVC自定义错误页面时遇到问题,您不是唯一的一个。很惊讶,你做的是正确的。失败的原因是有些错误是由ASP.NET管道处理的,而另一些错误是由iis直接处理的。
通常情况下(我预计在其他一些框架/服务器上也会是这种情况),我们只需要在一个地方配置自定义错误页面,不管错误是在哪里引起的。就像这样:
customerrors mode=' on ' error code=' 404 '路径=' 404.html'/errorcode=' 500 '路径=' 500 . html '/customerrors自定义404错误页
当一个资源不存在时(包括静态和动态),我们需要返回一个404状态的页面。通常,我们需要提供一些稍微友好的信息,而不是asp.net/iis生成的默认错误页面,以呈现给我们的网站访问者,这可能是为了给一些建议,为什么资源可能不存在或提供一个网站进行搜索。
仅供演示,简单设置如下:
!doctype html lang=' en ' head meta charset=' utf-8 '/title 404页面未找到/title/head body h1404页面未找到/h1/body/html我创建了一个新的ASP.NET MVC 5应用程序,其中包含vs附带的标准模板。如果我运行它并尝试导航到一个不存在的路径,例如/foo/bar,我将获得一个标准的ASP.NET 404页面:其中包含以下信息。
不是很友好,是吗?
这种情况下的错误是由ASP.NET MVC引起的,因为它找不到与url匹配的控制器或操作。
要自定义404错误页面,请在web.config的system.web/system.web中配置:部分
Customerrors mode=' on '错误状态代码=' 404 '重定向=' ~/404 . html '/customerrors mode=' on '以便我们可以在本地看到错误页面。通常,您可能只想在投入使用时呈现它,并将其设置为mode=“remote only”。
现在,如果我再次导航到/foo/bar,我可以看到我刚刚定义的错误页面。
然而,正如我所料,此时的url路径不是/foo/bar。ASP.NET将其重定向到/404.html?aspxerropath=/foo/bar,我检查响应的HTTP状态码在正常状态下也是200。
这很不好,返回http代码200不仅会引起误解,而且对SEO也不利。简单地说,如果指定路径的资源不存在,它应该返回到404。如果资源被移动,它应该被重定向到新的路径。
要解决这个问题,我们可以更改ASP.NET的默认行为,并重定向错误页面来重写响应。
customerrors mode=' on ' redirect mode=' response rewrite '错误状态代码=' 404 ' redirect=' ~/404 . html '//customerrors但是,它没有太大的作用(这是一个很长的故事)。虽然原始的网址没有被重定向,ASP.NET仍然返回200,我们的自定义错误页面显示为纯文本。
似乎我们必须回到ASP.NET的页面。如果你认为你不必去*。aspx页面又来了,恐怕让你失望了。
因此,将错误页面和对应的web.config更改为404.aspx后,url和内容类型(text/html)正常。
然而,200的问题仍然存在。对于这个问题,微软官方给出了相应的解决方案——来设置页面的状态码。我们在404.aspx中添加了以下部分:
%回应。状态代码=404 %
现在我们有了正确的状态代码,网址和自定义错误页面,是这样吗?
错了。
如果我们链接到静态页面路径(例如foo.html)或与我们的路由配置(例如/foo/bar/foo/bar)不匹配的URL,我们将看到一个标准的IIS 404错误页面。
上述情况绕过了ASP.NET,IIS处理请求。当然,如果你在Controllation中返回一个HttpNotFound(),你会得到同样的结果——。这是因为MVC只是简单地设置了状态代码而没有抛出错误,而是将它交给了IIS。
在这种情况下,我们需要设置iis的错误页面(仅对IIS 7有效)。在web . config system.webServer/system.webServer配置部分,
httpErrors errorMode='Custom ' remove status code=' 404 '/error status code=' 404 ' path='/404 . html ' response mode=' execute URL '/httpErrors还为本地测试设置了error mode=' Custom '。通常情况下,它将被设置为错误模式='详细本地'。
请注意,我使用的是html页面,而不是aspx。通常,您应该使用一个简单的静态文件作为错误页面,这样即使ASP.NET有错误,错误页面仍然可以正常显示。
现在,如果我们导航到一个不存在的静态文件路径,我们将得到一个自定义错误页面,而不是IIS默认的404页面,剩下的就是和以前一样的200问题。
幸运的是,IIS实际上提供了一个内置的解决方案来解决这个问题。如果设置responsemode=' file ',IIS将返回您的自定义错误页,而不更改原始响应标头:errorstatus代码=' 404 '路径=' 404 . html ' response mode=' file '/done。
自定义500个错误页面
大部分都只是复制了上面的解决方案,增加了一个自定义的500错误页面。这里有几个值得注意的地方。
标准ASP.NET MVC模板中内置的HandleErrorAttribute被用作全局过滤器。捕获任何由ASP.NET的MVC管道导致的错误,并返回一个自定义的“错误”视图,以提供您已经在web.config中启用了自定义错误。它查找~/view/{ controller name }/error . cshtml或~/view/shared/error . cshtml。
如果使用过滤器,则需要更新现有的自定义错误视图,如果不存在,则需要创建它们(最好在视图/共享文件夹中)
我没有看到任何可以在这个过滤器中设置的属性值。在MVC管道中引发的任何异常都将返回到标准的ASP.NET错误配置页面。既然要设置那些* *,这里就不需要这个滤镜了。
添加以下自定义错误页面配置:
Customerrors mode=' on '重定向模式=' response rewrite '错误状态代码=' 404 '重定向=' ~/404.aspx '/错误状态代码=' 500 '重定向=' ~/500.aspx'//Customerrors与之前创建的404 . aspx相似:
%回应。StatusCode=500 %!doctype html html lang=' en ' head meta charset=' utf-8 '/title 500服务器错误/title/head body h1500服务器错误/h1/body/html不幸的是,这不会捕获应用程序中的每个异常。一个非常常见的错误——是验证ASP.NET生成的请求,例如危险的url路径/foo/barscript/script,它实际上会生成404响应;因此,您可以添加默认错误配置:
customErrors mode=' Off ' redirectMode=' ResponseRewrite ' defaultRedirect=' ~/500 . aspx '错误状态代码='404' redirect='~/404.aspx'/错误状态代码=' 500 ' redirect=' ~/500 . aspx '/customErrors最后,为了捕获non-ASP.NET异常,我们设置了IIS自定义服务器内部错误500错误页面:
错误状态代码='500 '路径='500.html '响应代码='文件'/
摘要
在应用程序根目录中创建以下错误页面:
404.html-代表IIS404.aspx -代表ASP.NET500.html-代表IIS500.aspx -代表ASP。网
确认您在ASPX页面中设置的相应响应状态代码。
放弃MVC HandleErrorAttribute全局筛选器;配置ASP的自定义错误:网
customErrors mode=' remote only ' redirectMode=' ResponseRewrite ' defaultRedirect=' ~/500 . aspx '错误状态代码='404' redirect='~/404.aspx'/错误状态代码=' 500 ' redirect=' ~/500 . aspx '/customErrors配置IIS自定义错误页面:
http Error mode=' DetailedLocalOnly ' remove status code=' 404 '/Error status code=' 404 '路径='404.html '响应模式=' File '/remove status code='500 '/错误状态代码=' 500 '路径=' 500.html '响应模式=' File '/http errors原始链接:http://benfoster.io/blog/aspnet-mvc-custom-error-pages
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。