这里有新鲜出炉的精品教程, 程序狗速度看过来!
ASP.NET
ASP.NET 是. NET FrameWork 的一部分, 是一项微软公司的技术, 是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术, 它可以在通过 HTTP 请求文档时再在 web 服务器上动态创建它们 指 Active Server Pages(动态服务器页面) , 运行于 IIS(Internet Information Server 服务, 是 Windows 开发的 Web 服务器) 之中的程序
ASP.NET MVC 自定义错误页面真的简单吗? 这篇文章主要介绍了 ASP.NET MVC 自定义错误页面, 感兴趣的小伙伴们可以参考一下
如果你在设置 asp.net mvc 自定义错误页面时遇到问题, 这并不止你一个人惊讶之余你的做法是正确的, 没有起到作用的原因是其一部分错误是由 asp.net 管道处理的, 另一部分是由 iis 直接处理
通常情况 (我期望是这种情况, 在一些其他框架 / 服务器上) 我们只需要在一个地方配置自定义错误页就可以了, 无论怎么哪儿引发的错误就像这样︰
- <customErrors mode="On">
- <error code="404" path="404.html" />
- <error code="500" path="500.html" />
- </customErrors>
自定义 404 错误页面
当一个资源不存在时 (包含静态和动态), 我们需要返回一个 404 状态的页面, 通常我们需要提供一些稍微友好的信息替代 asp.net/iis 生成的默认错误页呈现给我们的网站访问者, 可能是提出一些忠告 为什么该资源可能不存在或提供选择要搜索的网站
这里仅作演示简单设置如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8"/>
- <title>404 Page Not Found</title>
- </head>
- <body>
- <h1>404 Page Not Found</h1>
- </body>
- </html>
我创建了一个新的 ASP.NET MVC 5 应用程序, 包含 vs 自带的标准模版如果我运行它尝试导航到一个不存在的路径 e.g. /foo/bar, 就会得到一个包含如下信息的标准 ASP.NET 404 页面:
不太友好不是?
这种情况的错误是由 ASP.NET MVC 引发因为它没有找到与 url 相匹配的 controller 或 action
为了自定义 404 错误页面, 在 web.config 的 <system.web></system.web > 配置节:
- <customErrors mode="On">
- <error statusCode="404" redirect="~/404.html"/>
- </customErrors>
mode="On" 这样我们就能在本地看到错误页面一般你可能只想在投入使用时呈现而设置为 mode="RemoteOnly"
现在如果我再次导航到 / foo/bar 就能看到我刚刚定义的错误页面.
然而正如我所料, 此时的 url 路径并不是 /foo/bar ASP.NET 将其重定向为 / 404.html?aspxerrorpath=/foo/bar, 而且我检查响应的 HTTP 状态码也为正常状态的 200
这是非常糟糕的, 返回 http code 200 不仅会引起误解, 也不利于 SEO 简单来讲, 如果指定路径的资源不存在应该返回 404 如果是资源被移动应该重定向到新路径
要修复这个问题我们可以更改 ASP.NET 默认行为 重定向错误页 为 重写返回 (rewrite the response)
- <customErrors mode="On" redirectMode="ResponseRewrite">
- <error statusCode="404" redirect="~/404.html"/>
- </customErrors>
然而这并没有太大的作用 (这老外真啰嗦). 尽管原 Url 地址没有被重定向, ASP.NET 仍然返回的是 200, 此外将我们自定义错误页显示为纯文本
似乎我们不得不返回一个 ASP.NET 页面. 如果你之前以为不用再去 *.aspx 页面的话, 那我恐怕让你失望了
因此将错误页及相应的 web.config 改为 404.aspx 之后, url 和 content type(text/html) 都正常了
但 200 的问题依然存在. 这个问题微软官方给出了相应的解决方案设置页面的状态码. 我们在 404.aspx 加入如下部分:
<% Response.StatusCode = 404 %>
我们现在得到了正确的状态码 url 及自定义错误页面, 就这样完事儿了吗?
错.
如果我们链接到一个静态页路径 (e.g. foo.html) 或一个不匹配我们路由配置的 URL (e.g. /foo/bar/foo/bar), 我们会看到到一个标准的 IIS 404 错误页面.
上述情况绕过了 ASP.NET 由 IIS 处理了请求. 当然如果你在 controller ation 中 return 一个 HttpNotFound() 也会得到同样的结果这是因为 MVC 只是简单的设置 status code 并没有抛出错误, 而是将它交给了 IIS.
这种情况我们需要设置 iis 的错误页面 (仅 IIS 7 + 有效). 在 web.config <system.webServer></system.webServer > 配置节中:
- <httpErrors errorMode="Custom">
- <remove statusCode="404"/>
- <error statusCode="404" path="/404.html" responseMode="ExecuteURL"/>
- </httpErrors>
同样设置 errorMode="Custom" 以便本地测试. 正常情况会设置为 errorMode="DetailedLocalOnly".
注意我使用了 html 页面, 而不是 aspx 通常你应该用简单的静态文件作为错误页面, 这样即使 ASP.NET 出现错误时错误页面依然能够正常显示
现在如果我们导航到一个不存在的静态文件路径就会得到一个自定义错误页面而不是 IIS 默认的 404 page, 剩下的还是和之前一样的 200 问题
幸运的是 IIS 实际上提供了内置的解决方案来解决这一点, 如果你设置 responseMode ="File"IIS 将返回您的自定义错误页面, 而不改变原始的响应标头︰
<error statusCode="404" path="404.html" responseMode="File"/>
搞定
自定义 500 错误页
大部分无外乎照搬上面的解决方法, 添加一个自定义的 500 错误页面这里有几点值得注意的地方
标准的 ASP.NET MVC 模板内置的 HandleErrorAttribute 作为一个全局过滤器捕获在 ASP.NET MVC 管道引发的任何错误, 并返回一个自定义 "错误" 视图提供你有在 web.config 中启用自定义错误它会寻找 ~/views/{controllerName}/error.cshtml 或 ~ / views/shared/error.cshtml
如果你使用了过滤器 (filter), 你需要更新现有的自定义错误视图, 并不存在的则需要创建 (最好放在 views/shared 文件夹下)
我没有看见这个 filter 有可以设置的属性值, 在 MVC 管道引发的任何异常都会退回到标准的 ASP.NET 错误配置页面, 既然你要设置那些 ** 那这里就用不到这个 filter
添加如下自定义错误页配置:
- <customErrors mode="On" redirectMode="ResponseRewrite">
- <error statusCode="404" redirect="~/404.aspx"/>
- <error statusCode="500" redirect="~/500.aspx"/>
- </customErrors>
类似于前面创建的 404.aspx:
- <% Response.StatusCode = 500 %>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8" />
- <title>500 Server Error</title>
- </head>
- <body>
- <h1>500 Server Error</h1>
- </body>
- </html>
不幸的是这样做并不会捕获到你应用程序中的每一个异常一个相当常见的错误由 ASP.NET 产生的请求的验证, 如一个危险的 url 路径 / foo/bar<script></script> , 这个实际上会产生一个 404 响应; 因此你可以添加一个默认错误配置:
- <customErrors mode="Off" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
- <error statusCode="404" redirect="~/404.aspx"/>
- <error statusCode="500" redirect="~/500.aspx"/>
- </customErrors>
最后为了捕获非 ASP.NET 异常我们设置 IIS 自定义服务器内部错误 500 错误页面:
<error statusCode="500" path="500.html" responseMode="File"/>
总结
在你的应用程序根目录创建如下错误页面:
- 404.html - for IIS
- 404.aspx - for ASP.NET
- 500.html - for IIS
- 500.aspx - for ASP.NET
确认您设置在 ASPX 页面内的适当响应状态码.
抛弃 MVC HandleErrorAttribute 全局筛选器; 配置 ASP.NET 的自定义错误:
- <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
- <error statusCode="404" redirect="~/404.aspx"/>
- <error statusCode="500" redirect="~/500.aspx"/>
- </customErrors>
配置 IIS 自定义错误页:
- <httpErrors errorMode="DetailedLocalOnly">
- <remove statusCode="404"/>
- <error statusCode="404" path="404.html" responseMode="File"/>
- <remove statusCode="500"/>
- <error statusCode="500" path="500.html" responseMode="File"/>
- </httpErrors>
来源: http://www.phperz.com/article/18/0313/352460.html