IIS7 ASPX 404错误页面/ Server.Transfer和相对路径的问题

时间:2011-01-21 11:33:00

标签: asp.net iis-7 http-status-code-404 relative-path server.transfer

我正在尝试实现一个通用的.NET 3.5 ASPX 404错误页面,该页面处理IIS 7中的“未找到”请求(经典模式)以及代码中抛出的404 HttpExceptions。我正在避免使用customErrors,因为我想要一个真正的404返回代码而不是重定向。

为此,我在web.config的system.webserver部分添加了以下内容:

<httpErrors>
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" subStatusCode="-1" path="/virtualdir/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />
</httpErrors>

我还在Global.asax Application_Error中添加了一个Server.Transfer调用来捕获代码中抛出的异常。

问题是相对路径(例如app_themes以及任何链接)是相对于错误页面而不是原始请求的URL计算的。

因此,对/virtualdir/fail/fail/fail/fail/fail.html的请求会尝试在/ virtualdir / fail / fail / fail / app_themes中找到app_themes。

我认为可能有一个涉及Request.RawUrl的解决方案,但我还没有找到它。

我确信我不能成为第一个遇到这个问题的人,但这次我的Google Fu让我失望了。

修改

我做了一些调查,在不同的情况下,错误的URL要么保存在Request.URL属性中(所需),要么作为格式的查询字符串的一部分附加到错误页面URL(/ virtualdir / errorpages / error404.aspx 404; HTTP://host/virtualdir/fail/fail/fail/fail/fail.html)

在我的IIS 6本地框中,ASPX错误以前一种方式运行,在IIS 7测试框中,ASPX页面使用后一种方法。

2 个答案:

答案 0 :(得分:1)

这是我的解决方案:

string queryString = Request.Url.Query;
if (queryString.StartsWith("?404;"))
{
    try
    {
        Uri newUri = new Uri(queryString.Replace("?404;", String.Empty));

        HttpContext.Current.RewritePath(newUri.PathAndQuery);
    }
    catch (UriFormatException)
    {
        // Do nothing, the query string is malformed.
    }
}

虽然感觉有点脏。我对声明性解决方案抱有希望。

答案 1 :(得分:0)

我现在无法测试它,但您是否尝试过使用代字号来使网址与app相关?例如:

<error statusCode="404" subStatusCode="-1" path="~/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />
相关问题