Пользовательский код состояния http для определенного ресурса в IIS

#http #iis #iis-7

#http #iis #iis-7

Вопрос:

У меня есть веб-сайт с одним ‘app_offline.htm ‘файл. Как я могу настроить IIS, чтобы возвращать его с определенным кодом состояния (скажем, 209) вместо кода по умолчанию (200)?

Ответ №1:

Альтернатива использованию ‘app_offline.htm ‘ особенность ASP.Net можно было бы использовать модуль перезаписи URL-адресов IIS, у него есть огромный набор трюков, и установка пользовательских кодов ответа является одним из них.

Если содержимое страницы не важно, важен только код ответа, то с помощью этого модуля вы можете настроить правило, которое будет возвращать пустой ответ с кодом 209 на любой запрос, пока правило включено.

Это материализуется в вашем web.config примерно так:

 <configuration>
    <system.webServer>       
        <rewrite>
            <rules>
                <rule name="app_offline" stopProcessing="true">
                    <match url=".*" />
                    <action type="CustomResponse" statusCode="209" statusReason="System unavailable" statusDescription="The site is currently down for maintenance, or something." />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
  

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

1. Не удается заставить это работать. Насколько я понимаю, модуль работает до поступления запроса ASP.NET конвейер. Я начинаю думать, что этого вообще невозможно достичь: (

2. Да, приведенный мной пример обработает запрос, вернув пустой ответ с кодом 209, даже не передавая его в ASP.Net . Это то, что вы получаете, но не то поведение, которое вы ищете?

3. Точно! ASP.NET всегда возвращает содержимое app_offline.htm с кодом 200 для ЛЮБОГО поступающего запроса. И мне нужно перезаписать его (пользовательский сценарий NLB).

4. А, ладно, узнал кое-что новое. Я никогда не использовал эту функцию ASP.Net . То, что я предложил, на самом деле было бы более полезным в качестве альтернативы размещению этого app_offline.htm создайте файл, вместо этого активировав правило, которое возвращает 209 для всех запросов, пока вы не захотите, чтобы сайт возобновил предоставление контента.

Ответ №2:

Поскольку IIS имеет специальную обработку для файла с именем ‘app_offline.htm ‘ в корне вашего веб-сайта это предложение может не сработать, если вы не переименуете файл. Но, в любом случае, это здесь…

Для этого вы можете использовать HttpHandler. В вашем web.config добавьте что-то вроде этого:

 <add name="app_offline_GET" path="app_offline.htm" verb="GET" type="namespace.classname,dllname" />
  

Очевидно, что замените соответствующую информацию в атрибуте ‘type’.

В HttpHandler сделайте что-то вроде этого:

 public void ProcessRequest(HttpContext context) {
  context.Response.WriteFile("app_offline.htm");
  context.Response.StatusCode = 209;        
  context.Response.StatusDescription = "whatever";
}
  

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

1. Это не работает, IIS по-прежнему возвращает «Служба 503 недоступна». И это правильно, потому что ваш обработчик управляется одним, но ‘app_offline.htm ‘ явно указывает прекратить обработку новых запросов, чтобы они не попали в код.

2. Невозможно ли изменить имя файла в вашей ситуации? Если нет, возможно, HttpModule (вместо HttpHandler) сработал бы достаточно рано в последовательности обработки, чтобы выполнить задание.

Ответ №3:

Чтобы отобразить конкретное содержимое на основе кода состояния, вы можете разрешить ответу задавать код состояния и сопоставлять содержимое для отображения на основе кода в разделе httpErrors. Смотрите пример в этом сообщении https://serverfault.com/questions/483145/how-to-add-a-site-wide-downtime-error-message-in-iis-with-a-custom-503-error-co

В интересах сохранения я воспроизведу приведенный ниже пример:

 <system.webServer>
    ...
    <rewrite>
        <rules>
            <rule name="SiteDown" stopProcessing="true">
                <match url=".*" />
                <action type="CustomResponse" statusCode="503" statusReason="Down for maintenance" statusDescription="will be back up soon" />
            </rule>
        </rules>
    </rewrite>

      <httpErrors existingResponse="Auto" errorMode="Custom" defaultResponseMode="File">
             <remove statusCode="503" subStatusCode="-1" />
             <error statusCode="503" path="503.html" />
      </httpErrors>
</system.webServer>