2

我们目前正在为我们的 Web 应用程序使用自定义错误页面来处理 404 错误。重定向发生时aspxerrorpath包含用户尝试访问的路径。是否可以在 Global.asax 中捕获错误Application_Error并在重定向发生之前将新参数附加到查询字符串?我想附加用户请求的主机。

我的理解是 IIS 处理 404 重定向并将aspxerrorpath参数附加到 404 重定向,我想在它发生之前拦截它并将另一个参数附加到查询字符串。

更多信息:我们在 CMS 中有多个站点,因此请求的 url 并不总是,www.example.com但 404 重定向总是 to 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/

4

3 回答 3

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;
}
于 2012-07-09T14:41:23.947 回答
1

为了捕获错误并附加查询,您需要通过继承 IHttpHandler 接口来编写自己的 HttpHandler 并在 ProcessRequest 方法中添加自定义代码

是的,这将适用于所有请求,但可以捕获您之后的请求

请参阅链接了解如何操作:MSDN

于 2012-07-09T13:45:45.160 回答
0

也许使用自定义过滤器属性是解决方案(实现 OnActionExecuted 以检查是否发生错误并修改结果)

于 2012-07-09T13:55:28.553 回答