C# 用IIS'响应;在ASP.NET页面中找不到标准404页面';s代码隐藏类

C# 用IIS'响应;在ASP.NET页面中找不到标准404页面';s代码隐藏类,c#,asp.net,iis,C#,Asp.net,Iis,我希望能够生成IIS的标准404响应,而不是自定义404页面,以响应代码隐藏类中的错误条件。我的Page\u Load方法如下所示: protected void Page_Load(object sender, System.EventArgs e) { this.a = ... ... if (this.a == null) ... // *** generate a 404 } 因此,如果a不为空,则.aspx文件呈现等,但如果a为空,则我希望标准的“资源找不到”

我希望能够生成IIS的标准404响应,而不是自定义404页面,以响应代码隐藏类中的错误条件。我的
Page\u 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;
if (a == null) throw new HttpException(404, "Not found");
(根据我所能找到的,这似乎是正确的方法)页面继续呈现(并在尝试使用
a
时给出一个
NullReferenceException
,响应代码为500)

如果我使用:

if (a == null) Response.StatusCode = 404;
if (a == null) throw new HttpException(404, "Not found");
响应代码是404,但页面内容是ASP.NET的未处理异常页面,显示HttpException(当
customErrors
On
时,它将显示为通用的“运行时错误”)

我想显示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();
        }
    }
    // ...
}
void应用程序\u错误(对象发送方,事件参数e)
{
var exception=Server.GetLastError();
if(异常为HttpException)
{
var httpException=(httpException)异常;
if(httpException.GetHttpCode()==404)
{
var context=HttpContext.Current;
context.Response.Clear();
context.Response.StatusCode=404;
context.Response.StatusDescription=“未找到”;
context.Response.Write(“404未找到”);
context.Server.ClearError();
}
}
// ...
}
这让我可以设置自己对异常的响应。这种方法有两个缺点:

  • 我真正想做的是将控制权恢复到IIS并让它显示默认的404响应,我找不到一种方法来实现这一点
  • 新的响应(由
    context.response.Write()
    编写)针对每个404显示,而不仅仅是代码中生成的响应
看来我需要:

  • 从后面的代码,重定向到一个定制页面,解释找不到“thing”(这也设置了404响应代码),或者
  • 设置自定义全局404页面

重定向到不存在的页面怎么样。

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

如果你把它们结合起来(我肯定还有几个类似的)。从全局asax看来,将404输出写入响应流可以绕过自定义错误

考虑到这一点,您可以在代码隐藏中故意引发自定义异常。检查应用程序_错误中的自定义异常,然后从那里用404响应?这将阻止页面呈现,并且一切都应该按照您的要求进行

编辑:

如果每个404异常都显示了这一点,而您不希望这样,那么为您的原始代码创建一个自定义异常,以启动。只捕获应用程序错误中的特定异常,允许其他异常正常通过


我还发现OP和你一样,试图提升404页面,而不是它的模型。关于如何做到这一点,这里有一些建议,不知道其中任何一个是否有效,但可能值得快速尝试。

@Ben Scott正如JNappi所说,他的方法是基于JNappi的想法的一个很好的解决方案,我想我可以建议你想一想

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

这样就可以避免302重定向消息


但我觉得这仍然是一个解决方案,但希望它能帮助您。

这可能会奏效。它在不存在的页面上给出了302重定向,然后是404重定向,这可能会给搜索引擎带来问题,但这不是我的优先考虑。我本来希望得到的东西不是那么混乱,但我想我会失望的。谢谢。我已经编辑了我的答案以回应你的编辑。希望能有所帮助。谢谢@Smudge202链接,但我能从帖子中得到的最好建议是一个空白页。可能它与IIS有关,我实际上只是在使用Cassini或VS2008使用的任何东西,所以我将在真正的服务器上进行测试。干杯@欢迎你。这里还有一个链接,以防你没有看到。他正试图做与你想做的相反的事,所以也许你可以逆转这个过程:-(仍然不好。我将放弃并重定向到我自己的错误页面。看来IIS获得控制权的唯一方法是允许应用程序_错误在不清除错误的情况下运行,这将导致500服务器错误。感谢您的帮助!