C# 用IIS'响应;在ASP.NET页面中找不到标准404页面';s代码隐藏类
我希望能够生成IIS的标准404响应,而不是自定义404页面,以响应代码隐藏类中的错误条件。我的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为空,则我希望标准的“资源找不到”
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响应,我找不到一种方法来实现这一点
- 新的响应(由
编写)针对每个404显示,而不仅仅是代码中生成的响应context.response.Write()
- 从后面的代码,重定向到一个定制页面,解释找不到“thing”(这也设置了404响应代码),或者
- 设置自定义全局404页面
我还发现OP和你一样,试图提升404页面,而不是它的模型。关于如何做到这一点,这里有一些建议,不知道其中任何一个是否有效,但可能值得快速尝试。@Ben Scott正如JNappi所说,他的方法是基于JNappi的想法的一个很好的解决方案,我想我可以建议你想一想 当您遇到404错误时,尝试显示导航到自定义404错误消息页面,但确保服务器上不存在此类自定义404错误页面。这将自动为您抛出默认的404错误消息 这样就可以避免302重定向消息
但我觉得这仍然是一个解决方案,但希望它能帮助您。这可能会奏效。它在不存在的页面上给出了302重定向,然后是404重定向,这可能会给搜索引擎带来问题,但这不是我的优先考虑。我本来希望得到的东西不是那么混乱,但我想我会失望的。谢谢。我已经编辑了我的答案以回应你的编辑。希望能有所帮助。谢谢@Smudge202链接,但我能从帖子中得到的最好建议是一个空白页。可能它与IIS有关,我实际上只是在使用Cassini或VS2008使用的任何东西,所以我将在真正的服务器上进行测试。干杯@欢迎你。这里还有一个链接,以防你没有看到。他正试图做与你想做的相反的事,所以也许你可以逆转这个过程:-(仍然不好。我将放弃并重定向到我自己的错误页面。看来IIS获得控制权的唯一方法是允许应用程序_错误在不清除错误的情况下运行,这将导致500服务器错误。感谢您的帮助!