在ASP.NET页面的代码隐藏类中响应IIS标准的404 Not Found页面

时间:2011-05-26 05:17:27

标签: c# asp.net iis

我希望能够生成IIS的标准404响应,而不是自定义404页面,以响应代码隐藏类中的错误情况。我的Page_Load方法如下所示:

protected void Page_Load(object sender, System.EventArgs e)
{
    this.a = ...
    ...
    if (this.a == null) ... // *** generate a 404
}

因此,如果a不为空.aspx文件呈现等,但如果a为空,我想要标准“无法找到资源”页面将显示404响应代码。

如果我使用:

if (a == null) Response.StatusCode = 404;

(根据我能找到的内容似乎是正确的方法)页面继续呈现(并在尝试使用NullReferenceException时提供响应代码为500的a )。

如果我使用:

if (a == null) throw new HttpException(404, "Not found");

响应代码是404,但页面内容是ASP.NET未处理的异常页面,显示HttpException(当customErrorsOn时,它会显示为通用的“运行时错误”)。

我想显示IIS的404页面,因为用户会理解这一点,但如果它显示服务器错误,他们可能不会检查页面的响应代码。

编辑:看起来我无法做到这一点。鉴于@ Smudge202的答案,我让我的代码隐藏抛出HttpException并将代码添加到Global.Application_Error()以处理这些异常:

void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();

    if (exception is HttpException)
    {
        var httpException = (HttpException)exception;
        if (httpException.GetHttpCode() == 404)
        {
            var context = HttpContext.Current;
            context.Response.Clear();
            context.Response.StatusCode = 404;
            context.Response.StatusDescription = "Not Found";
            context.Response.Write("<h1>404 Not Found</h1>");
            context.Server.ClearError();
        }
    }
    // ...
}

这让我可以设置自己对异常的响应。这种方法有两个缺点:

  • 我真正想做的是将控制权恢复到IIS并让它显示默认的404响应,我找不到办法做到这一点
  • 每个404显示新响应(由context.Response.Write()编写),而不仅仅是代码中生成的

所以看起来我需要:

  • 从代码隐藏中,重定向到定制页面,解释无法找到“事物”(也设置404响应代码),或
  • 设置自定义全局404页面

3 个答案:

答案 0 :(得分:1)

如何重定向到不存在的页面。

答案 1 :(得分:1)

我怀疑这是一个干净的解决方案,但它可能有用......

如果你合并this post(和我确定的几个相似)。似乎从全局asax写出一个404到响应流绕过自定义错误。

考虑到这一点,您可以故意在代码中引发自定义异常。检查Application_Error中的自定义异常,并从那里回复404?这会阻止页面呈现,一切都应该按照你的要求工作吗?

编辑:

如果为每个404异常显示此内容并且您不希望它出现,请为后面的原始代码创建一个自定义异常以触发。只捕获Application_Error中的特定异常,允许其他人正常通过?

我还发现this thread OP正在尝试像你一样提高实际的404页面,而不是模拟它。关于如何做到这里有一些建议,不知道它们是否有效,但可能值得快速尝试。

答案 2 :(得分:0)

作为JNappi的@Ben Scott说,根据JNappi的想法,他的方法很好,我想我可以建议你一个人思考。

如果遇到404错误,请尝试显示导航到自定义404错误消息页面,但请确保服务器上不存在此类自定义404错误页面。这将自动为您抛出默认的404错误消息。

这样你可以避免302重定向信息。

但我觉得这仍然是解决方案,但希望它可以帮助你。