ASP.NET Пользовательские страницы ошибок MVC, застрявшие в цикле перенаправления

#asp.net #asp.net-mvc #redirect #iis #custom-error-pages

#asp.net #asp.net-mvc #перенаправление #iis #пользовательские страницы ошибок

Вопрос:

Я пытаюсь показать пользовательские страницы ошибок в моем ASP.NET Приложение MVC. Я понимаю, что некоторые ошибки обрабатываются ASP.NET и другие от IIS.

The ASP.NET они обрабатываются и работают нормально

 <customErrors mode="On" defaultRedirect="~/Error/Index"/>
  

Когда я запрашиваю URL, который не существует, и ссылается на статическую страницу, такую как .html, я ожидаю, что IIS обработает его.

 <httpErrors errorMode="Custom">
      <remove statusCode="404"/>
      <error statusCode="404" path="http://localhost/MySite/404.html" responseMode="Redirect"/>
</httpErrors>
  

И это работает. Однако я не хочу жестко кодировать http://localhost там, но сделайте это относительным путем.

Итак, я попытался

 <httpErrors errorMode="Custom">
    <remove statusCode="404"/>
    <error statusCode="404" path="~/404.html" responseMode="Redirect"/>
</httpErrors>
  

Однако это продолжает перенаправлять меня (кажется), поскольку URL-адрес заканчивается http://localhost/MySite/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/404.html

Это также работает, если я делаю

 <httpErrors errorMode="Custom">
    <remove statusCode="404"/>
    <error statusCode="404" path="404.html" responseMode="Redirect"/>
</httpErrors>
  

Но, конечно, только если ошибка находится в http://localhost/MySite/doesnotexist.html корневом каталоге, но не в каком-либо другом подобном http://localhost/MySite/somedir/doesnotexist.html

Если я изменю responseMode на любой из других параметров, он вообще не работает, показывает мне страницу IIS 404 по умолчанию.

Я глубоко озадачен, что вызывает цикл перенаправления?

Комментарии:

1. Является ли path=»~/404.html » просто не указан правильный путь? Т.Е. корень веб-приложения?

Ответ №1:

Я смог воспроизвести поведение, которое вы описываете. Мой был исправлен, когда я изменил responseMode на file . Т. Е. вот так

 <httpErrors errorMode="Custom">
  <remove statusCode="404" />
  <error statusCode="404" path="404.html" responseMode="File" />
</httpErrors> 
  

Но, возможно, проблема в том, что вы поместили свой 404.html в папке mysite. Предполагая, что он должен оставаться там, я думаю, что это должно сработать, если вы сделаете это

 <httpErrors errorMode="Custom">
  <remove statusCode="404" />
  <error statusCode="404" path="/mysite/404.html" responseMode="Redirect" />
</httpErrors>   
  

Комментарии:

1. Mysite — это приложение IIS, которое можно настроить, поэтому я также не могу жестко закодировать это. Но вы правы, что это будет работать так же, как при использовании localhost/MySite/404.html . Когда я использую file , он вообще не распознает его, это все равно, что вообще не указывать никаких httpErrors

Ответ №2:

Атрибут path указывает путь к файлу или URL, который отправляется в ответ на ошибку HTTP, указанную атрибутами StatusCode и subStatusCode. Если вы выбираете режим ответа файла, вы указываете путь к пользовательской странице ошибок. Если вы выбираете режим ответа ExecuteURL, путь должен быть относительным URL сервера (например, /404.htm ). Если вы выберете режим ответа перенаправления, вам необходимо ввести абсолютный URL (например, www.contoso.com/404.htm).

Атрибут responseMode указывает, как возвращается содержимое пользовательской ошибки. Атрибут responseMode может иметь одно из следующих возможных значений. Перенаправляет клиентские браузеры на URL, указанный в атрибуте path, который содержит пользовательский файл ошибки. Если для responseMode установлено значение Redirect, значением path должен быть абсолютный URL.

Комментарии:

1. Спасибо, да, я прочитал об этом, и вот как это происходит. Однако мне интересно, есть ли способ ввести путь относительно корня приложения, а не корня сервера, без указания имени приложения / папки

2. Это кажется невозможным, вам нужно выбрать, какой путь использовать в соответствии с responseMode, существует только три responseMode, и нет пути относительно корня приложения.