Можно ли использовать относительный путь при настройке пользовательской страницы ошибок в IIS7? - PullRequest
24 голосов
/ 09 июня 2011

Я пытаюсь установить пользовательскую страницу ошибки 404 для своего веб-приложения. Проблема в том, что это приложение будет развернуто в различных средах. Иногда он будет в виртуальном каталоге, а иногда - нет.

У меня есть страница с ошибкой в ​​каталоге ErrorPages, и я настроил мою конфигурацию так:

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

Ответы [ 2 ]

4 голосов
/ 05 октября 2012

Вы можете использовать преобразования 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 голосов
/ 07 мая 2012

Я столкнулся с подобной проблемой, поэтому я использовал код на стороне сервера для перенаправления на страницу 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...