我希望能够生成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
为空,我想要标准“无法找到资源”页面将显示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();
}
}
// ...
}
这让我可以设置自己对异常的响应。这种方法有两个缺点:
context.Response.Write()
编写),而不仅仅是代码中生成的所以看起来我需要:
答案 0 :(得分:1)
如何重定向到不存在的页面。
答案 1 :(得分:1)
我怀疑这是一个干净的解决方案,但它可能有用......
如果你合并this post(和我确定的几个相似)。似乎从全局asax写出一个404到响应流绕过自定义错误。
考虑到这一点,您可以故意在代码中引发自定义异常。检查Application_Error中的自定义异常,并从那里回复404?这会阻止页面呈现,一切都应该按照你的要求工作吗?
编辑:
如果为每个404异常显示此内容并且您不希望它出现,请为后面的原始代码创建一个自定义异常以触发。只捕获Application_Error中的特定异常,允许其他人正常通过?
我还发现this thread OP正在尝试像你一样提高实际的404页面,而不是模拟它。关于如何做到这里有一些建议,不知道它们是否有效,但可能值得快速尝试。
答案 2 :(得分:0)
如果遇到404错误,请尝试显示导航到自定义404错误消息页面,但请确保服务器上不存在此类自定义404错误页面。这将自动为您抛出默认的404错误消息。
这样你可以避免302重定向信息。
但我觉得这仍然是解决方案,但希望它可以帮助你。