我们目前正在为我们的网络应用程序使用404错误的自定义错误页面。发生重定向时aspxerrorpath
包含用户尝试访问的路径。是否有可能在Global.asax中捕获Application_Error
中的错误并在重定向发生之前将新参数附加到查询字符串中?我想追加用户请求的主机。
我的理解是IIS处理404重定向并将aspxerrorpath
param附加到404重定向,我想在它发生之前拦截它并将另一个参数附加到查询字符串。
更多信息:我们在CMS中有多个网站,因此请求的网址不会始终为www.example.com
,但404重定向始终为www.example.com
。
目前:用户请求www.example.com/fakepage.aspx
并重定向到...
www.example.com/404.aspx?aspxerrorpath=/fakepage.aspx
我想要的是:用户请求www.example.com/fakepage.aspx
并重定向到...
www.example.com/404.aspx?aspxerrorpath=/fakepage.aspx&aspxerrorhost=example.com
解: 我最终实现了一个自定义的HttpModule(参见下面的答案)。我只是想传递一篇很好的文章来解释如何做到这一点。 http://helephant.com/2009/02/11/improving-the-way-aspnet-handles-404-requests/
答案 0 :(得分:4)
尝试将以下代码放在global.asax文件中:
void Application_Error(object sender, EventArgs e)
{
string host = Context.Request.Url.Host;
string redirectUrl = string.Format("~/Error.html?aspxerrorpath={0}&aspxerrorhost={1}", Server.UrlEncode(Context.Request.Path), Server.UrlEncode(host));
Response.Redirect(redirectUrl);
}
这实际上是创建自己的错误处理程序以重定向到错误页面,这更灵活,因为您可以向URL添加您想要的任何查询参数。
要使用此方法,您将无法以正常方式在web.config文件中配置重定向。但是,您可以使用文件的appSettings
部分,然后读取如下值:
Web.config文件
<appSettings>
<add key="redirectPath" value="valueGoesHere"/>
</appSettings>
C#错误处理程序
string redirectPath = System.Configuration.ConfigurationManager.AppSettings["redirectPath"];
编辑:
此外,如果您需要根据http错误代码重定向到不同的页面,请在错误处理程序中使用以下代码:
HttpException exception = Server.GetLastError() as HttpException;
int errorCode = -1;
if(exception != null)
{
errorCode = exception.GetHttpCode();
}
switch (errorCode)
{
case 404:
// Redirect here
break;
default:
// Redirect here
break;
}
答案 1 :(得分:1)
为了捕获错误并附加查询,您需要通过继承IHttpHandler接口并在ProcessRequest方法中添加自定义代码来编写自己的HttpHandler
是的,这将适用于所有请求,但可以捕获您之后的
请参阅有关如何操作的链接:MSDN
答案 2 :(得分:0)
可能使用自定义过滤器属性是解决方案(实现OnActionExecuted以检查是否发生了错误并修改了结果)