发生404重定向时如何添加其他查询字符串参数

时间:2012-07-09 13:40:40

标签: c# asp.net http-status-code-404 custom-error-handling

我们目前正在为我们的网络应用程序使用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/

3 个答案:

答案 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以检查是否发生了错误并修改了结果)