尝试发送404响应不会触发IIS 404页面

本文关键字:IIS 404页面 响应 | 更新日期: 2023-09-27 17:51:08

我有一个ASP。.NET页面(使用。NET 4.0框架),它只在非常特定的情况下返回数据。其余时间,我希望它返回404错误,就好像页面不存在一样(原因背后有一个完整的故事)。

为了达到这个目的,作为一个例子,我有一个Page_Load处理程序,看起来像这样:
protected void Page_Load(object sender, EventArgs e)
{
    if (!Request.QueryString.AllKeys.Contains<string>("q"))
    {
        Response.Clear();
        Response.StatusCode = 404;
        Response.End();
    }
}

我本以为这会触发IIS的404页面,因为我没有设置任何customError页面。相反,我得到一个404响应和一个没有内容的页面。

我还尝试了另一种方法,将上面的Response代码放入Global.asaxApplication_Error处理程序中,并创建一个自定义异常来抛出我需要从页面中爆炸的事件,但这会导致获得一个未处理的异常页面。

我只是误解了这应该是如何工作的,还是我错过了一个非常明显的步骤?

编辑:

让它更清楚一点——我知道当IIS发送回404响应请求时,它也会发送回少量的HTML内容,导致页面内容如下:

Server Error in '/' Application.
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 
Requested URL: /doesntexist.aspx

尝试发送404响应不会触发IIS 404页面

我发现使用ASPX页面实际上无法实现这一点。不过,我可以通过使用HttpHandler来实现。在处理程序中,如果我设置context.Response.StatusCode = 404,那么我得到默认的IIS 404页面,正如我所期望的。

这个页面确实存在——它是IIS在发送404时生成的一个简短的、信息丰富的HTML片段,以便最终用户不会只收到一个空白页面。