我希望能够生成 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(然后当 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();
}
}
// ...
}
这让我可以设置自己对异常的响应。这种方法有两个缺点:
- 我真正想做的是将控制权恢复到 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/