IIS7 ASPX 404 Error Pages / Server.Transfer и проблемы с относительными путями - PullRequest
1 голос
/ 21 января 2011

Я пытаюсь реализовать универсальную страницу ошибок .NET 3.5 ASPX 404, которая обрабатывает как «не найденные» запросы в IIS 7 (классический режим), так и 404 исключения HttpException, добавленные в код. Я избегаю customErrors, так как хочу получить реальный код возврата 404. Вместо перенаправления.

Для этого я добавил в раздел system.webserver файла web.config следующее:

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

Я также добавил вызов Server.Transfer в Global.asax Application_Error для захвата исключений, добавленных в код.

Проблема в том, что относительные пути (такие как app_themes, а также любые ссылки) рассчитываются относительно страницы ошибки, а не URL исходного запроса.

Поэтому запрос /virtualdir/fail/fail/fail/fail/fail.html пытается найти app_themes в /virtualdir/fail/fail/fail/app_themes.

Я думаю, что может быть решение, связанное с Request.RawUrl, но я еще не нашел его.

Я уверен, что не могу быть первым, у кого возникла эта проблема, но мой Google Fu подвел меня на этот раз.

EDIT

Я провел некоторое исследование, и при других обстоятельствах ошибочный 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 ]

1 голос
/ 24 января 2011

Это мое решение:

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.
    }
}

Хотя кажется, что оно немного грязное.Я надеюсь на декларативное решение.

0 голосов
/ 22 января 2011

Я не могу проверить это прямо сейчас, но вы пытались использовать тильду, чтобы сделать URL-адреса относительными к приложениям? например:

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