Temos um servidor IIS que hospeda centenas de aplicativos Web separados, e o servidor de banco de dados físico que hospeda esses aplicativos ficará offline para manutenção por um breve período (esperamos que demore menos de 15 minutos).
Durante esse período, queremos redirecionar TODO o tráfego que chega, para qualquer site, a uma página "estamos em manutenção".
Sei que posso fazer isso acessando todos os aplicativos Web e configurando uma regra de reescrita do IIS que envia o usuário para outra página para todas as solicitações desse aplicativo. Mas levaríamos mais tempo para fazer isso do que para fazer a manutenção do banco de dados!
Eu tentei três coisas, nenhuma das quais funcionou:
Regra global de reconfiguração do IIS
Eu tenho procurado uma maneira simples de aplicar uma regra a todos os sites, de uma só vez - e depois poder "desfazer" essa regra em uma etapa igualmente indolor. Até agora, nenhuma das minhas tentativas funcionou. Tentei colocar essa regra de reescrita no meu web.config global em W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="redirect all requests" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
</conditions>
<action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Isso não funcionou. Estamos executando o .NET 4.0 de 64 bits no IIS, mas "por precaução", coloquei a mesma coisa nos arquivos web.config globais de 32 bits e 2,0, e ainda assim não há alterações.
App_Offline.htm "arquivo especial"
Outra sugestão que eu vi é o arquivo "especial" app_offline.htm , mas estamos com o mesmo problema: levar mais tempo para implantar esse arquivo na raiz de todos os nossos aplicativos do que realmente faria a manutenção.
Site "Estamos offline" no IIS
Todos os nossos sites são configurados no IIS com um único IP. Isso funciona para nós, mesmo sem o SNA, porque todos os nossos aplicativos compartilham um único certificado SSL (é um UCC). Uma coisa que me ocorreu foi que talvez eu pudesse configurar um site no IIS que correspondesse todo o tráfego ao IP que estamos usando e não especificasse um valor de cabeçalho de host. A esperança era que eu desse uma "precedência" mais alta e que, quando iniciada, correspondesse todo o tráfego a esse IP, antes que qualquer um dos outros sites tivesse a chance de corresponder. Eu poderia configurar esse site para exibir a mesma página para todas as solicitações, independentemente do URL da solicitação.
Inicie esse site quando estiver em manutenção e pare-o quando terminar.
Mas também não consegui fazer isso funcionar, pois o IIS parece corresponder uma solicitação HTTP a um site mais específico antes de menos específico. Portanto, ao omitir um valor de cabeçalho de host para este site "informe aos usuários que estamos offline", ele não era correspondido, a menos que a solicitação não tivesse um valor de cabeçalho de host que correspondesse a outro site. O que nos coloca de volta ao mesmo problema de ter que ir manualmente a cada aplicativo Web e executar uma ação para colocá-lo offline e colocá-lo novamente online quando concluirmos a manutenção
Existe uma maneira simples de conseguir isso? Parece que certamente não somos os primeiros a encontrar esse problema.
-Josh