Измените http-статус 503 на 200 при обслуживании app_offline.htm для определенного URL-адреса

Файл app_offline.htm, который обслуживает ASP.NET, возвращает статус http 503. Это правильное поведение для большинства ситуаций. Однако в сценарии, в котором запрашивается конкретный URL-адрес (например, https://www.mywebsite.com/monitor), я хотел бы изменить возвращаемый статус http на 200, в то же время возвращая статус http 503 во всех других ситуациях. Возможно ли это?

Причина, по которой я хочу это сделать - всякий раз, когда мы проводим плановое сопровождение на нашем веб-сайте, мы используем файл app_offline.htm, но мы не хотим, чтобы наша служба мониторинга работоспособности (Pingdom.com) сообщала о простоях во время нашей запланированной техническое обслуживание.

Я предполагаю, что это должно быть на уровне IIS, потому что app_offline.htm получает очень ранний запрос в цикле обработки запроса.

Ответ 1

Обратите внимание, что App_Offline используется только для части ASP.NET, это не имеет никакого отношения к сайту IIS. Все запросы, отличные от nonASP.NET, например,.htm-, будут проходить через обычный конвейер IIS.

При этом a HTTP 503 является недоступной ошибкой службы. App_Offline.htm частично отключить сайт, это нормально и правильно, что все запросы ASP.NET получают ответ 503, когда сайт находится в автономном режиме.

Обход этого с помощью HttpModule или любого другого кода в конвейере ASP.NET не является допустимым решением.

Поскольку вы уже создаете/копируете App_Offline.htm в свой корень IIS во время обслуживания, я предлагаю добавить maintenance.htm в качестве документа по умолчанию для вашей папки /monitor или вашего сайта IIS и создать/скопировать maintenance.htm в нем во время обслуживания: тогда страница по умолчанию будет доступна независимо от того, что сайт ASP.NET отключен или нет.

Если ваш зонд вызывает http://servername/monitor/ uri без какой-либо страницы, он будет работать.

Вам просто нужно удалить его - например, вы удалите свой App_Offline - после обслуживания.

Ответ 2

Насколько я знаю, логика app_offline.htm обрабатывается внутри модуля ASP.NET 2.0, но до начала загрузки приложения (что, конечно же, является идеей app_offline.htm * g *).

Я предлагаю:

  • Добавьте виртуальный каталог с именем monitor в корень вашего (отключенного) веб-сайта и назначьте его в какую-то читаемую IIS папку.
  • Не превращайте виртуальный каталог в приложение, поэтому ASP.NET должен не выходить из этой папки.
  • Положить, например. копию вашего файла app_offline.htm, переименованного в default.htm (или все, что находится в списке имен файлов по умолчанию) в эту папку.

Таким образом, IIS должен обслуживать html файл с ответом 200 при доступе к https://www.mywebsite.com/monitor.

А, и, чтобы удостовериться в предупреждении Adilson о поисковых системах, просто добавьте <meta name="robots" content="noindex"> к вашему файлу в случае, если сайт доступен поисковыми системами.

Ответ 5

Вы можете обработать метод Global.asax Application_Error, идентифицировать свой URL-адрес, идентифицировать свою ошибку, перенаправить на свою страницу

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim ctx = HttpContext.Current
        dim myerror = ctx.Error
        If HttpContext.Current.Request.Path = "mypath" Then
            HttpContext.Current.Response.Redirect("~/mydestpage.aspx")
        End If
    End Sub

Это будет возвращено сначала 302 для вашего предыдущего запроса, а затем перенаправляется на страницу с 200...

Ответ 6

Эй, мужчина. Будьте осторожны, когда делаете это! Ответ 200 может сделать вашу страницу ошибки проиндексированной Google и другими поисковыми системами.

Если вы все же решите сделать это, я думаю, вам следует создать HttpModule и поместить его в верхнюю часть стека модулей. Этот модуль должен проверить, существует ли файл App_offline.html, если да, то вы проверяете, пришел ли запрос от Site Monitor. В этом случае вы можете ответить с 200, иначе код ответа должен быть 503, чтобы избежать плохой индексации сайта.

Важно: пул приложений вашего сайта должен находиться в Интегрированном режиме.