• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET MVC自定义错误页面真的简单吗?

ASP.NET MVC自定义错误页面真的简单吗?

作者:Cameron 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Cameron通过本文主要向大家介绍了asp net mvc,asp net mvc 4,asp net mvc 5,精通asp.net mvc 5,精通asp.net mvc 4等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

如果你在设置asp.net mvc自定义错误页面时遇到问题,这并不止你一个人。惊讶之余你的做法是正确的,没有起到作用的原因是其一部分错误是由asp.net管道处理的,另一部分是由iis直接处理。

通常情况 (我期望是这种情况,在一些其他框架/服务器上) 我们只需要在一个地方配置自定义错误页就可以了,无论怎么哪儿引发的错误。就像这样︰

<customErrors mode="On">
  <error code="404" path="404.html" />
  <error code="500" path="500.html" />
</customErrors>
</div>

自定义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>
</div>

我创建了一个新的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> 
</div>

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>
</div>

然而这并没有太大的作用(这老外真啰嗦).尽管原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>
</div>

同样设置 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>
</div>

类似于前面创建的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>
</div>

 不幸的是这样做并不会捕获到你应用程序中的每一个异常。一个相当常见的错误——由 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>
</div>

 最后为了捕获非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>
</div>

配置IIS自定义错误页:

<httpErrors errorMode="DetailedLocalOnly">
 <remove statusCode="404"/>
 <error statusCode="404" path="404.html" 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET MVC从视图传参到控制器的几种形式
  • ASP.NET MVC 4 中的JSON数据交互的方法
  • ASP.NET MVC制作404跳转实例(非302和200)
  • 详解ASP.NET MVC 利用Razor引擎生成静态页
  • 详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
  • ASP.NET MVC4 利用uploadify.js多文件上传
  • ASP.NET mvc4中的过滤器的使用
  • Asp.net MVC下使用Bundle合并、压缩js与css文件详解
  • 详解Asp.Net MVC——控制器与动作(Controller And Action)

相关文章

  • 2017-05-11asp.net 细说文件读写操作(读写锁)
  • 2017-05-11asp.net 文章内容分页显示的代码
  • 2017-05-11ADO.NET无连接模式的详细介绍
  • 2017-05-11.aspx中的命名空间设置实现代码
  • 2017-05-11asp.net MVC实现简单的上传功能
  • 2017-05-11利用委托把用户控件的值显示于网页案例应用
  • 2017-05-11ASP.NET中Global和URLReWrite用法
  • 2017-05-11Asp.net 图片文件防盗链(尊重劳动成果)及BeginRequest事件学习
  • 2017-05-11Asp.net mvc 数据调用示例代码
  • 2017-05-11某个aspx页面突然死了连日志也没有的解决方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET中常用的用来输出JS脚本的类
    • .NET Core系列之MemoryCache 缓存选项
    • asp.net 生成静态时的过滤viewstate的实现方法
    • asp.net下用js实现鼠标移至小图,自动显示相应大图
    • 小心!ASP.NET网站发布时的那些坑
    • asp.net传多个值到其它页面的具体实现
    • ASP.NET 重定向的几种方法小结
    • asp.net的cms 绑定数据篇
    • c#多图片上传并生成缩略图的实例代码
    • dataGrid 多维表头、表头跨行跨列设计及绑定数据

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有