【问题标题】:Custom HTTP error page自定义 HTTP 错误页面
【发布时间】:2011-03-26 09:57:48
【问题描述】:
在 asp.net 中,我可以像这样定义一个自定义错误页面:
<configuration>
<system.web>
<customErrors mode="On">
<error statusCode="404" redirect="/servererrors/404.aspx" />
</customErrors>
</system.web>
</configuration>
现在我的问题是:如果我将 404.aspx 替换为 AnyHTTP.aspx,
并且想获取http错误的编号来概括页面,我如何获得该错误编号?
【问题讨论】:
标签:
c#
asp.net
vb.net
http
error-handling
【解决方案1】:
在 CustomErrors (ASP.NET 3.5 SP1) 中尝试此设置:
<customErrors mode="RemoteOnly" defaultRedirect="/servererrors/AnyHTTP.aspx" RedirectMode="ResponseRewrite"/>
作为不同的解决方案,您也可以在 Global.asax 中执行此操作:
void Application_Error(object sender, EventArgs e)
{
Server.Transfer("/servererrors/AnyHTTP.aspx");
}
然后在您的错误页面上,加载最后一个错误:
Exception e = Server.GetLastError();
在 Global.asax 文件中使用 Server.Transfer() 很重要;使用 Response.Redirect 将引发 302 错误,您将丢失您想要捕获的错误。
【解决方案3】:
我建议不要使用 web.config 方法。 customErrors 重定向到错误页面,这没什么意义。本质上,它首先会说“哦,是的,这会很好,你只需要去这里”,然后然后说“哦,我们没有找到那个”。这真的是一个错误(如果这里没有任何东西,那么为什么服务器告诉我去这里,很明显用户代码看起来你服务器代码搞砸了;他们去了正确的 URI,然后你指导他们发错人了)。
使用 global.asax 中的 Server.Transfer(),设置默认 HTTPHandler,或设置 IIS 以执行(而不是重定向到)您的 .aspx 或其他文件与您的实现。如果您希望相同的处理程序来管理每个错误,那么您可以,例如,从 global.asax 执行 Server.Transfer(),但包含有关错误类型的查询字符串参数(无论是简单的 HTTP 状态代码,还是更详细的东西),或者在HttpContext中传递信息。