Статья Скотта Гу о переписывании URL указала мне правильный путь (так сказать!) - спасибо за подсказку, Джеймс.
Ответ должен использовать Context.RewritePath(newPath)
Вот код, который я использую на своей странице 404 -
protected override void Render(HtmlTextWriter writer)
{
string rebase = Server.UrlDecode(Request.ServerVariables["QUERY_STRING"]);
if (rebase.Length>10 && rebase.StartsWith("404;"))
{
try
{
rebase = new Uri(rebase.Substring(4)).AbsolutePath;
}
catch
{
rebase = "/";
}
finally
{
Context.RewritePath(rebase);
}
}
base.Render(writer);
Response.StatusCode = 404;
}
Для того, чтобы обрабатывать отсутствующие страницы .aspx таким же образом, в web.config
есть настройка redirectMode
, для которой установлено ResponseRewrite
<customErrors mode="On" redirectMode="ResponseRewrite">
<error statusCode="404" redirect="~/error404.aspx" />
</customErrors>
Это останавливает поведение по умолчанию перенаправления пользователя на ~/error404.aspx?aspxerrorpath=badfile
Примечание. Этот параметр является новым для последних пакетов обновления ASP.NET (например, Framework 3.5 SP1)
Справочник MSDN для redirectMode