Подтвердить что ты не робот

Можно ли использовать относительный путь при настройке страницы пользовательских ошибок в 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>
4b9b3361

Ответ 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/