none
在ASP.NET MVC 如何在Response.StatusCode = 404的同时,显示友好的自定义错误页面 RRS feed

  • 问题

  • 请教大家,由于是ASP.NET MVC 项目,所以IIS的通配符要映射到aspnet_isapi.dll 。当敲入不合法的URL时,比如: http://www.xxx.com/sdfsdfsdfsdfs ,我们的web.config 定义了

      <customErrors mode="On" defaultRedirect="/Content/ErrorPage.aspx" redirectMode="ResponseRewrite">
       <error statusCode="403" redirect="/Content/NoAccess.htm" />
       <error statusCode="404" redirect="/Content/FileNotFound.aspx" />
      </customErrors>
    

    那么当发生404错误是,MVC自动跳转到/Content/FileNotFound.aspx,由于为了避免产生200成功的状态码,我在/Content/FileNotFound.aspx中定义了

    <% 
      Response.StatusCode = 404;
    %>
    

    可结果是IE会显示“无法找到该网页”,而火狐却可以显示的StatusCode,又可以显示我们自定义的错误页面。请如如何解决啊?

    我用firebug 调试了好久,却总是这样。我希望达到的效果和博客园一样,敲入www.cnblogs.com/sdfsdfsdfsdf 可以显示友好的错误页面,又可以显示404的状态码。


    2010年12月13日 9:05

答案

  • 不要意思,黄天不负苦心人,终于解决了。只要404 response有http body,就会显示body内容,只有当实在没有内容可显示(例如没有body,或者为空格)的时候才会显示错误页面
    512byte的事情是ie5/6的逻辑。

    最后只能加一点小说来填满512byte了。

    我的FileNotFound.aspx页面:

    <%@ Page Language="C#" Inherits="System.Web.UI.Page" %>
    <script runat="server">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!IsPostBack)
        {
          Response.Status = "404 No Found";
        }
      }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
      <title>页面不存在诗圣杜甫斯蒂芬</title>
    </head>
    <body>
    <p>
    1998年,我在惠州晚报当记者。在工作之余,我常到报社附近的咖啡厅或茶座听一些成功人士聊天。这些成功人士包括某一领域的学术权威和一些行业的精英,这些人幽默风趣,举重若轻,把自己的成功看作是非常自然和顺理成章。时间长了,我发现,在读书时,我被一些成功人士欺骗了。那些人为了让想创业或正在创业的人知难而退,普遍把自己创业的艰辛夸大了,也就是说,他们在用自己的成功经历吓唬那些还没有取得成功的人。
    作为一名年轻的记者,我认为很有必要对成功人士的心态加以研究。经过几年的观察和阅读了大量古今中外的名人传记,我发现成功并不像我想象的那么难,这个发现鼓舞了我。因为它从一个新的角度告诉我,成功与“劳其筋骨,饿其体肤”、“三更灯火五更鸡”、“头悬梁,锥刺股”没有必然的联系。只要你对某一事业感兴趣,长久地坚持下去就会成功,因为上帝赋予我们的时间和智慧够我们圆满地做完一件事情。因此,任何人都具有成功的条件,每个人自身就是巨大财富宝库,请运用这把金钥匙,发动你内在的发动机。这把金钥匙就是找准一个“点”,拥有“三条心”。“点”就是起点,“三条心”就是信心、热心、恒心,一个“点”加上“三条心”,这就是走向生活成功的金钥匙。也许有的同学会问:成功就这么简单?是的,就这么简单。越成功越简单,越简单越成功。
    找准一个成功的起点
    什么是起点?我们的生日就是生命的起点;小溪流是大海的起点;种子是希望的起点;沙砾是高塔的起点;信心是成功的起点;春天是丰收的起点;一月是一年的起点!
    在生命的原野和人生的旅途上起点无处不在。一个人选好了起点就等于找准了成功的方向;一件事选对了起点就等于开创了美好结局的一半;一个目标划分好了起点就等于缩短了与成功的距离。
    起点有高有低、有大有小、有好有坏、有近有远。起点往往以小见大,好比千里大堤,微不足道的蚁穴是瓦解它的小起点,更是致命的起点;好比挺拔的参天大树,幼芽是它迎风淋雨能否成材的关键起点。好比巍峨的山脉,如果没有山脚的沙石为起点,怎么会有高瞻远瞩的壮阔画卷?
    也许由于种种原因我们站在较低的起点上,我们不可能修改人生的长度,但我们可以改变人生的宽度和深度;如果我们不能拥有美好的人生,那我们必须拥有美好的人生观;如果我们不能拥有令人仰慕的高起点,那我们可以拥有追求高起点的信心和理想,让信心作桨,热心为风,恒心作船,以小河流为起点,长风破浪风向前进。
    下面请听我讲一个令人难以置信的真实故事。凯伊拉是非洲一个小村落的贫穷青年,有一天,他决定徒步横越非洲大陆,前往美国西海岸。他母亲并不知道美国在那里。他对母亲说:“妈妈,我想到美国去上大学。你答应我去吗?”“很好,”母亲说,“你可以去,什么时候动身呢?”凯伊拉不希望母亲有时间去发现美国在很远的地方,因为害怕母亲会因此改变主意。于是他说明天就出发。
    第二天,凯伊拉就离开了非洲尼沙兰北部的老家。他首先想到达开罗,他希望从那儿搭船前往美国。开罗远在3000英里之外,他无法了解这个距离究竟有多远,他傻傻地认为四五天内走到。但在四五天之内,他只来到距离他家乡大约只有70多英里的地方,食物吃光了,他不知道该怎么办,只知道他必须继续向前走。
    他创造出一种旅行方式,这种方式成了他一年多的生活方式。村落与村落之间的距离通常只有五六里,而且走的是森林中的小路。他会在下午到达一个村落向村里人请求是否可以通过劳动获取食物、饮水和睡觉的地方。如果有这种机会,他就会留下来过夜,然后第二天早上向第二个村落出发。路上总有各种各样的困难阻碍他的进程。丛林中有许多他害怕的野兽,而事实上,他手无寸铁,对它们没有任何防卫力量。虽然在夜间会听见它们的叫声,但它们没有从没有向他逼近。
    一个后,他已步行1000多英里,来到乌干达。在那里,他无意中看到一本美国大学指南,知道美国大学有时候会给优秀青年提供奖学金。于是他写了一份申请书,按照列在指南上的学校一家家写信去申请。3 个星期后,他得到了奖学金。他大喜过望立即前往当地的美国办事机构,但他们告诉他还不够。他需要一份护照和来回的旅行费用,这样才能申请签证。于是他写信给曾在他童年教导过他的传道士们,经过了他们的努力,凯伊拉终于得到了出国护照。但他扔然得不到签证,因为他无法筹措到那笔费用。
    他依旧意志坚定,又重新开始了他的旅程。他穿过乌干达,进入苏丹。此时,村落之间的距离彼此更为遥远。有时候,他必须在一天之中步行20或30英里,才能找到一个睡觉的地方或是得到工作来换取食物。最后,他来到喀士穆,有人告诉他,那儿有个美国领事馆。他再一次听到美国入境所需的规定,不过这位领事对他大感兴趣,并且写了一封信把他的困难告诉了学校,很快回电就来了。经过许许多多个月之后,凯伊拉穿着他的第一套学生装,进入美国一所学院。至于故事后来的发展,他凭借从不放弃的积极心态,成为英国剑桥大学的政治学教授,并成为他祖国的总统候选人。
    凯伊拉的起点已经很低了,但他在坚强信念的陪伴下,取得了巨大的成就。因此,起点低不可怕,可怕的是失去向更高目标看齐的信心;起点低不可怕,可怕的是没有化小为大的毅力。
    精卫填海,起点只有嘴里的一口泥土;愚公移山,起点只有一副担子。同学们,任何人都有起点,那你们的起点在那里呢?我认为,你们的起点是站在迈向社会的人生起跑线上。你们现在的学习就是为起跑热身做准备。人生的道路虽然漫长,但紧要处常常只有几步,特别是当人年轻的时候。没有一个人的生活道路是笔直的没有岔道口。有些岔道口,个人生活上的岔道口,你走错了一步,可能影响人生的一个时期,也可以影响一生。因此,在人生的起跑线上,找准起点显得尤其重要。身在校园,胸谋前程。分析你的起点吧,新的希望就在后面;转化你的起点吧,成功正在其中酝酿;选好你的起点吧,人生的崭新书篇章正期待你去书写!
    </p>
      <br />
      <br />
      <br />
      <br />
      <center>
        <img src="/Content/FileNotFound.jpg" width="465" height="208" alt="文件没有找到!" />
      </center>
    </body>
    </html>
    
    

    • 已标记为答案 陈书函 2010年12月14日 1:15
    2010年12月13日 9:56

全部回复

  • 不要意思,黄天不负苦心人,终于解决了。只要404 response有http body,就会显示body内容,只有当实在没有内容可显示(例如没有body,或者为空格)的时候才会显示错误页面
    512byte的事情是ie5/6的逻辑。

    最后只能加一点小说来填满512byte了。

    我的FileNotFound.aspx页面:

    <%@ Page Language="C#" Inherits="System.Web.UI.Page" %>
    <script runat="server">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!IsPostBack)
        {
          Response.Status = "404 No Found";
        }
      }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
      <title>页面不存在诗圣杜甫斯蒂芬</title>
    </head>
    <body>
    <p>
    1998年,我在惠州晚报当记者。在工作之余,我常到报社附近的咖啡厅或茶座听一些成功人士聊天。这些成功人士包括某一领域的学术权威和一些行业的精英,这些人幽默风趣,举重若轻,把自己的成功看作是非常自然和顺理成章。时间长了,我发现,在读书时,我被一些成功人士欺骗了。那些人为了让想创业或正在创业的人知难而退,普遍把自己创业的艰辛夸大了,也就是说,他们在用自己的成功经历吓唬那些还没有取得成功的人。
    作为一名年轻的记者,我认为很有必要对成功人士的心态加以研究。经过几年的观察和阅读了大量古今中外的名人传记,我发现成功并不像我想象的那么难,这个发现鼓舞了我。因为它从一个新的角度告诉我,成功与“劳其筋骨,饿其体肤”、“三更灯火五更鸡”、“头悬梁,锥刺股”没有必然的联系。只要你对某一事业感兴趣,长久地坚持下去就会成功,因为上帝赋予我们的时间和智慧够我们圆满地做完一件事情。因此,任何人都具有成功的条件,每个人自身就是巨大财富宝库,请运用这把金钥匙,发动你内在的发动机。这把金钥匙就是找准一个“点”,拥有“三条心”。“点”就是起点,“三条心”就是信心、热心、恒心,一个“点”加上“三条心”,这就是走向生活成功的金钥匙。也许有的同学会问:成功就这么简单?是的,就这么简单。越成功越简单,越简单越成功。
    找准一个成功的起点
    什么是起点?我们的生日就是生命的起点;小溪流是大海的起点;种子是希望的起点;沙砾是高塔的起点;信心是成功的起点;春天是丰收的起点;一月是一年的起点!
    在生命的原野和人生的旅途上起点无处不在。一个人选好了起点就等于找准了成功的方向;一件事选对了起点就等于开创了美好结局的一半;一个目标划分好了起点就等于缩短了与成功的距离。
    起点有高有低、有大有小、有好有坏、有近有远。起点往往以小见大,好比千里大堤,微不足道的蚁穴是瓦解它的小起点,更是致命的起点;好比挺拔的参天大树,幼芽是它迎风淋雨能否成材的关键起点。好比巍峨的山脉,如果没有山脚的沙石为起点,怎么会有高瞻远瞩的壮阔画卷?
    也许由于种种原因我们站在较低的起点上,我们不可能修改人生的长度,但我们可以改变人生的宽度和深度;如果我们不能拥有美好的人生,那我们必须拥有美好的人生观;如果我们不能拥有令人仰慕的高起点,那我们可以拥有追求高起点的信心和理想,让信心作桨,热心为风,恒心作船,以小河流为起点,长风破浪风向前进。
    下面请听我讲一个令人难以置信的真实故事。凯伊拉是非洲一个小村落的贫穷青年,有一天,他决定徒步横越非洲大陆,前往美国西海岸。他母亲并不知道美国在那里。他对母亲说:“妈妈,我想到美国去上大学。你答应我去吗?”“很好,”母亲说,“你可以去,什么时候动身呢?”凯伊拉不希望母亲有时间去发现美国在很远的地方,因为害怕母亲会因此改变主意。于是他说明天就出发。
    第二天,凯伊拉就离开了非洲尼沙兰北部的老家。他首先想到达开罗,他希望从那儿搭船前往美国。开罗远在3000英里之外,他无法了解这个距离究竟有多远,他傻傻地认为四五天内走到。但在四五天之内,他只来到距离他家乡大约只有70多英里的地方,食物吃光了,他不知道该怎么办,只知道他必须继续向前走。
    他创造出一种旅行方式,这种方式成了他一年多的生活方式。村落与村落之间的距离通常只有五六里,而且走的是森林中的小路。他会在下午到达一个村落向村里人请求是否可以通过劳动获取食物、饮水和睡觉的地方。如果有这种机会,他就会留下来过夜,然后第二天早上向第二个村落出发。路上总有各种各样的困难阻碍他的进程。丛林中有许多他害怕的野兽,而事实上,他手无寸铁,对它们没有任何防卫力量。虽然在夜间会听见它们的叫声,但它们没有从没有向他逼近。
    一个后,他已步行1000多英里,来到乌干达。在那里,他无意中看到一本美国大学指南,知道美国大学有时候会给优秀青年提供奖学金。于是他写了一份申请书,按照列在指南上的学校一家家写信去申请。3 个星期后,他得到了奖学金。他大喜过望立即前往当地的美国办事机构,但他们告诉他还不够。他需要一份护照和来回的旅行费用,这样才能申请签证。于是他写信给曾在他童年教导过他的传道士们,经过了他们的努力,凯伊拉终于得到了出国护照。但他扔然得不到签证,因为他无法筹措到那笔费用。
    他依旧意志坚定,又重新开始了他的旅程。他穿过乌干达,进入苏丹。此时,村落之间的距离彼此更为遥远。有时候,他必须在一天之中步行20或30英里,才能找到一个睡觉的地方或是得到工作来换取食物。最后,他来到喀士穆,有人告诉他,那儿有个美国领事馆。他再一次听到美国入境所需的规定,不过这位领事对他大感兴趣,并且写了一封信把他的困难告诉了学校,很快回电就来了。经过许许多多个月之后,凯伊拉穿着他的第一套学生装,进入美国一所学院。至于故事后来的发展,他凭借从不放弃的积极心态,成为英国剑桥大学的政治学教授,并成为他祖国的总统候选人。
    凯伊拉的起点已经很低了,但他在坚强信念的陪伴下,取得了巨大的成就。因此,起点低不可怕,可怕的是失去向更高目标看齐的信心;起点低不可怕,可怕的是没有化小为大的毅力。
    精卫填海,起点只有嘴里的一口泥土;愚公移山,起点只有一副担子。同学们,任何人都有起点,那你们的起点在那里呢?我认为,你们的起点是站在迈向社会的人生起跑线上。你们现在的学习就是为起跑热身做准备。人生的道路虽然漫长,但紧要处常常只有几步,特别是当人年轻的时候。没有一个人的生活道路是笔直的没有岔道口。有些岔道口,个人生活上的岔道口,你走错了一步,可能影响人生的一个时期,也可以影响一生。因此,在人生的起跑线上,找准起点显得尤其重要。身在校园,胸谋前程。分析你的起点吧,新的希望就在后面;转化你的起点吧,成功正在其中酝酿;选好你的起点吧,人生的崭新书篇章正期待你去书写!
    </p>
      <br />
      <br />
      <br />
      <br />
      <center>
        <img src="/Content/FileNotFound.jpg" width="465" height="208" alt="文件没有找到!" />
      </center>
    </body>
    </html>
    
    

    • 已标记为答案 陈书函 2010年12月14日 1:15
    2010年12月13日 9:56
  • 我是在Application_Error里写了个transfer。这样的好处是可以用静态页面
    2010年12月16日 6:41