昨天公司要求给所有项目添加自定义404错误页,具体的要求实现的有以下几点:

1.实现自定义错误(如各种error,404等)跳转到指定的页面

2.所指定的页面输出的http状态值必须是404或其他指定的statecode

3.跳转到的自定义错误页面必须是.html后缀结尾

关于第一点,这个很简单,大家都知道,只需要在webconfig里面对customErrors节点作相应设置,如下

<customErrors mode="On" defaultRedirect="Error.html">
<error statusCode="404" redirect="404NotFond.html"></error>
</customErrors>

由于真正的html静态页输出的http状态值只能是200(ok),所以,为了使输出的statuscode为404或其他值,必须将它伪静态化,在MVC里,将一个html页实现伪静态的效果也很简单,只需要对路由做些配置,在Global.aspx.cs文件里

        /// <summary>
/// 路由控制
/// </summary>
/// <param name="routes"></param>
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//routes.IgnoreRoute("{resource}.jpg"); #region 错误页路由
routes.MapRoute(
"404NotFund",// Route name
"404NotFond.html",// URL with parameters
new
{
controller = "Error",
action = "error"
} // Parameter defaults
);
routes.MapRoute(
"Error",// Route name
"Error.html",// URL with parameters
new
{
controller = "Error",
action = "error"
} // Parameter defaults
);
#endregion
}

在这里,我们将两个自定义错误页的路由都指向了ErrorController下的名为error的Action,接下来,就需要告诉这个Action对外输出的statuscode

public class ErrorController : Controller {
/// <summary>
/// 页面错误
/// </summary>
/// <returns></returns>
public ActionResult error() {
Response.Status = "404 Not Found";
Response.StatusCode = 404;
return View();
}
}

这里,我们指定它输出的StatusCode为404,接下来,你就可以去粉饰你真正的404自定义错误页,也就是这个Action输出的页面Views/Error/error.aspx

这些都做完之后,你就可以在本地开始调试看看效果了,不过在调试之前,一定要将项目里error.html和404NotFond.html页面删掉,因为,在MVC默认设置中,如果访问路径URL中的静态文件在项目中存在,它会优先取静态文件,从而绕过了路由,那么此时你的global里对这些静态文件路由的设置将毫无用处

确保你的项目里不存在相同路径下同名的静态文件后,在本地调试,应该可以就达到预期效果了

不过,当我把项目部署到服务器的IIS7上的的时候,发现在本地访问服务器上的,始终出来的都是

并不是我指定的自定义错误页,但是在本地调试程序,以及用服务器上的浏览器打开看却又是正常的,所以,我怀疑是IIS在搞鬼
经过大半个下午的挣扎思索,最终让我找到了一个关键点,在IIS的站点设置里
有一项关于“错误页”的设置
 

右键404——》编辑功能设置

点击打开

默认设置的是“本地请求的详细错误和远程请求的自定义错误”,这个意思是,如果本地打开(在服务器用浏览器打开)它展示的是详细错误,如果是远程请求(外网访问服务器)它展示的是自定义错误页,而它(IIS)理解的自定义错误页是

这样一来,就好理解了,知道该怎么办了

办法有三个,一是“编辑错误页设置”面板里设为始终展示“详细信息”,二是“编辑自定义错误页”面板里修改文件路径到你自定义的html错误页

三是在webconfig的<system.webServer>节点里添加

<httpErrors>
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="http://www.uzai.com/404NotFond.html" responseMode="Redirect" />
</httpErrors>

有的时候,由于服务器IIS给的权限不够大,还不足以修改httperrors里的配置,这个时候需要在服务器上以管理员的身份运行一下命令来解禁:

%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/httpErrors

三个方法任选其一,有时也可能需要混合使用,具体是情况而定

此博文为本人原创,若要转载,请标明出处~

MVC自定义错误页404静态页的更多相关文章

  1. NET MVC RazorEngine 解析模板生成静态页

    ASP.NET MVC 解析模板生成静态页一(RazorEngine) 简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是 ...

  2. .net(全局文件,错误页,静态页,IIS配置及防黑)

    添加全局应用程序类. <%@ Application Language="C#" %> <script runat="server"> ...

  3. 在ASP.NET MVC自定义错误页面

    异常处理跳转页面 第一步,在项目的Web.config文件中找到节点<system.web> 在此节点下添加配置(Error为定义的控制器也可以多添加些error标签用于区分不同的错误) ...

  4. MVC自定义错误页面

    MVC异常处理主要有三种方案:1.基于HandleErrorAttribute重写OnException方法:2.基于Global.apsx添加Application_Error方法:3.直接在Web ...

  5. ASP.NET MVC 自定义错误页面心得

    自定义错误页面的目的,就是为了能让程序在出现错误/异常的时候,能够有较好的显示体验. 所以,首先要先了解,我们可以在哪里捕获异常. 当程序发生错误的时候,我们可以在两个地方捕获: Global里面的A ...

  6. MVC 自定义 错误页面

    很多时候,我们需要自定义错误页面,用来当发生异常后引导用户进入一个比较友好的错误页面. 在这里,我归结一下我常用的2个方案 1   通过Global.asax 文件来处理异常信息(这个不管是 MVC ...

  7. MVC自定义错误日志异常处理

    MVC添加错误日志处理模块很简单,只要写个继承自HandleErrorAttribute的过滤器,重新OnException方法,贴个异常处理代码如下: public class ExceptionA ...

  8. ASP.net MVC自定义错误处理页面的方法

    在ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那 ...

  9. .NET MVC自定义错误处理页面的方法

    在ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那 ...

随机推荐

  1. 【ASP.NET】C# 将HTML中Table导出到Excel(TableToExcel)

    首先,说下应用场景 就是,把页面呈现的Table 导出到Excel中.其中使用的原理是 前台使用ajax调用aspx后台,传递过去参数值,导出.使用的组件是NPOI. 前台调用: <script ...

  2. C++ for循环效率

    1.考虑二维数组,在C++中,以先行后列的方式存储连续的数组元素.也就是同一行的元素在一起,同一列的元素之间有间隔,且间隔相同.理想情况下,二维数组的元素是随机访问的,可以直接定位,即i*列数+j.因 ...

  3. cdoj 31 饭卡(card) 01背包

    饭卡(card) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/31 Des ...

  4. Socket编程学习之道:揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1.         什么是TCP/IP.UDP? 2.         S ...

  5. android安全:forceStopPackage对android的Alarm的影响

    也许一些使用alarmmanager做定时任务的同学遇到过这样的问题:设定alarm后,进入设置-->应用程序管理-->强行停止app后,定时任务就失效了. 简单的讲就是:force st ...

  6. 发现js端日期跟php端日期格式不一致

    当程序没有问题,而php显示的日期和js显示的日期不一致,相差一天的时候或者其它,一定要看看php.ini中时区的配置是否合理.

  7. 不相交集(The Disjoint Set ADT)

    0)引论 不相交集是解决等价问题的一种有效的数据结构,之所以称之为有效是因为,这个数据结构简单(几行代码,一个简单数组就可以搞定),快速(每个操作基本上可以在常数平均时间内搞定). 首先我们要明白什么 ...

  8. 进程控制之exit函数

    进程有下面5种正常终止方式: (1)在main函数内执行return语句.这等效于调用exit. (2)调用exit函数.此函数有ISO C定义,其操作包括调用各终止处理程序(终止处理程序在调用ate ...

  9. Tcsh脚本编程

    Tcsh主要用于Free BSD等UNIX系统中. 一.输出字符串Hello的示例脚本 Tcsh脚本的基本格式.编写方法及脚本中使用的命令等,与Bash脚本完全相同,只需要直接套用即可. [root@ ...

  10. Oracle—用户管理的完全恢复(四)

    在用户管理的备份(三)中,最后打开数据库时,用了alter database open resetlogs;的命令,这里为什么用resetlogs命令? 一.resetlogs的作用 1.将当前的日志 ...