Можно ли использовать относительный путь при настройке страницы пользовательских ошибок в IIS7?
Я пытаюсь настроить страницу ошибки 404 для моего веб-приложения. Проблема в том, что это приложение будет развернуто в нескольких разных средах. Иногда это будет в виртуальном каталоге, а иногда и не будет.
У меня есть страница с ошибкой в каталоге с именем ErrorPages и настроил мой config следующим образом:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="/VirtualDir/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
Проблема заключается в том, что я развертываю это в корневом каталоге веб-сайта, часть /VirtualDir
должна быть удалена. Если я удалю его перед развертыванием, мне нужно добавить его обратно при развертывании в виртуальный каталог. Есть ли способ установить путь относительно виртуального каталога, а не на сайт?
Я попытался использовать ~
, но это тоже не работает:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="~/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
Ответы
Ответ 1
Вы можете использовать преобразования web.config для установки пути для среды:
web.config
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="/VirtualDir/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
web.Release.config
<httpErrors>
<error statusCode="404" path="/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
Ответ 2
Я столкнулся с аналогичной проблемой, поэтому я использовал код сервера для перенаправления на страницу CustomError с динамически созданным URL (с виртуальным каталогом или без него), хотя ~/успешно перенаправляет правильный путь отсюда.
При возникновении ошибки в приложении запускается Application_Error и, в конце концов, этот кодовый блок запускается:
if (App.Configuration.DebugMode == DebugModes.ApplicationErrorMessage)
{
string stockMessage = App.Configuration.ApplicationErrorMessage;
// Handle some stock errors that may require special error pages
HttpException httpException = serverException as HttpException;
if (httpException != null)
{
int HttpCode = httpException.GetHttpCode();
Server.ClearError();
if (HttpCode == 404) // Page Not Found
{
Response.StatusCode = 404;
Response.Redirect("~/ErrorPage.aspx"); // ~ works fine no matter site is in Virtual Directory or Web Site
return;
}
}
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = 404;
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
Вместо того, чтобы писать путь к странице в разделе httpErrors в файле web.config, вы можете создать настройку приложения и сохранить там путь. В коде позади вы можете получить путь от настройки приложения и перенаправить, как описано выше.
Я нашел другую аналогичную ссылку, и он объяснил это лучше меня, поэтому просто пойдите, хотя это
http://labs.episerver.com/en/Blogs/Ted-Nyberg/Dates/112276/2/Programmatically-configure-customErrors-redirects/