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