如何解决在ASP.NET页面的代码隐藏类中响应IIS的标准404 Not Found页面
| 我希望能够生成IIS的标准404响应,而不是自定义404页面,以响应代码隐藏类中的错误情况。我的Page_Load
方法看起来像这样:
protected void Page_Load(object sender,System.EventArgs e)
{
this.a = ...
...
if (this.a == null) ... // *** generate a 404
}
因此,如果a
不为null,则呈现.aspx
文件,以此类推,但是如果a
为null,我希望显示标准的“找不到资源”页面,并带有404响应代码。
如果我使用:
if (a == null) Response.StatusCode = 404;
(根据我所发现的,这似乎是正确的方法)页面继续呈现(并在尝试使用a
时给出NullReferenceException
的响应码为500)。
如果我使用:
if (a == null) throw new HttpException(404,\"Not found\");
响应代码为404,但页面内容为ASP.NET未处理的异常页面,显示HttpException(当customErrors
为On
时,将显示为通用\“ Runtime Error \”)。
我想显示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()
编写),而不仅仅是代码中生成的响应
因此,看起来我将需要:
从后面的代码中,重定向到一个定制页面,该页面说明找不到“ thing”(这也设置了404响应代码),或者
设置自定义全局404页面
解决方法
我怀疑这是一个干净的解决方案,但它可能会起作用...
如果您将这篇文章(以及一些类似的我相信)结合在一起。从全局asax看来,将404写入响应流似乎绕过了自定义错误。
考虑到这一点,您可以有意在后面的代码中引发自定义异常。检查Application_Error中的自定义异常,然后从那里响应404?这样会阻止页面呈现,一切都应该按照您的要求工作吗?
编辑:
如果每个404异常都显示了此代码,并且您不希望出现该异常,请为您要触发的原始代码创建一个自定义异常。仅在Application_Error中捕获该特定异常,是否允许其他异常照常通过?
我还发现了该线程,OP像您一样试图提高实际的404页面,而不是其模型。关于如何执行此操作,有一些建议,不知道它们是否有效,但可能值得快速尝试。
,如何重定向到不存在的页面。
,正如JNappi所说,@ Ben Scott说,他的方法是围绕JNappi的思想进行的一项很好的工作,我想我可以建议您一个想法。
每当遇到404错误时,请尝试显示导航到自定义404错误消息页面,但请确保服务器上不存在此类自定义404错误页面。这将自动为您引发默认的404错误消息。
这样,您可以避免302重定向消息。
但是我仍然认为这是解决方案,但希望能对您有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。