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

标签 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为 null 我希望标准 “找不到资源” 页面显示 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 响应,但我找不到这样做的方法
  • 新响应(由 context.Response.Write() 编写)针对每个 404 显示,而不仅仅是代码中生成的响应

所以看起来我需要:

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

最佳答案

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

如果结合this post (我敢肯定还有几个类似的)。似乎从全局 asax 向响应流写入 404 绕过了自定义错误。

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

编辑:

如果每个 404 异常都会显示,而您不希望出现这种情况,请为您的原始代码创建一个自定义异常以触发。只捕获 Application_Error 中的特定异常,让其他异常正常通过?

我还找到了this thread OP 像您一样试图提升实际的 404 页面,而不是它的模型。那里有一些关于如何做到这一点的建议,不知道它们是否有效,但可能值得快速尝试。

关于c# - 在 ASP.NET 页面的代码隐藏类中响应 IIS 的标准 404 Not Found 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6134007/

相关文章:

asp.net - 部署预编译

c# - DirectoryEntry IIS 访问权限

powershell - Powershell FTP 模块(WebAdministration)中的属性是否区分大小写?

c# - 在 asp net mvc 5 中使用 session 变量进行授权

c# - 获取类似于 Windows 任务计划程序中提供的日期选择器

c# - SQL Server数据库专项查询

对 SignalR 集线器方法的 Javascript 调用不返回值

c# - 反射(reflection):如何调用带参数的方法

c# - 如何在 asp.net 5 中创建 ClaimIdentity

iis - 应用程序池不会运行