Existem várias maneiras de lidar com o que você está solicitando e alguns aspectos diferentes da sua pergunta:
Lidar com pequenas atualizações para promoções
O que você realmente procura aqui é um sistema de gerenciamento de conteúdo ou similar que permita editar o conteúdo rapidamente (pense em Wordpress / Drupal ou do ponto de vista .NET N2 CMS, Umbraco, Orchard, etc.), no entanto algumas coisas que você poderia tentar se não seguisse esse caminho.
Como o ASP.NET é realmente recarregado apenas se você tocar em certos tipos de arquivo (web.config (s), principalmente o conteúdo das pastas /bin/
e /app_code/
) - e possui um limite configurável para "outras alterações de arquivo" (basicamente depois de modificado) Em muitos arquivos do seu site, o pool de aplicativos será reiniciado - NumRecompilesBeforeAppRestart
). Você pode fazer algo em que verifica uma pasta diferente em busca de .html
arquivos estáticos (ou seja ) que você extrai e exibe conforme necessário, ou utiliza o LoadControl
método que segue um caminho de string para um .ascx
controle de usuário e o carrega dinamicamente - como você determina qual mostrar é uma pergunta diferente e mais adequada ao StackOverflow - no entanto, recomendo uma solução baseada em convenção de nomenclatura.
Você também pode usar algo como o MEF - Managed Extensibility Framework (que faz parte integrante do .NET framework desde a versão 4), que permite escrever uma arquitetura baseada em plugins e especificar uma pasta fora do /bin/
diretório para monitorar .DLLs novos - embora eu não tenha tentado isso para verificar se ele evitará o problema de reinicialização do aplicativo, usei isso com bom efeito em um ambiente da Web para adicionar funcionalidades comuns a um site.
Se isso não agradar, a única outra opção em que posso pensar seria adicionar os controles como "code-in-front", como fizemos no ASP clássico - ou seja, com um <script runat="server">
bloco em vez de uma classe "code-behind" compilada que contém a lógica para executar o controle - o que irá eliminar a necessidade de uma mudança DLL, à custa de alguma perda de desempenho pela primeira vez como o controle é compilado em tempo real - novamente você precisa equilibrar isso com o NumRecompilesBeforeAppRestart
se Estamos fazendo muitas pequenas mudanças.
Como persisto as sessões nas reinicializações de aplicativos?
Esta é possivelmente uma questão mais fácil de resolver e envolve três etapas principais:
- Configure o MachineKey (IIS7, mas ainda vale para 8) como um valor constante, e não
AutoGenerate
- isso significa que, quando o AppPool reciclar, ele usará a mesma chave e poderá descriptografar cookies de sessão, viewstate etc. a reciclagem.
- Ou configurar um servidor de estado ou configurar um banco de dados para armazenar estado da sessão .
- Alterne de usar
InProc
para StateServer
ou SQLServer
no elemento SessionState no seu web.config.
Dessa forma, você terá sessões persistentes que sobreviverão à reinicialização do aplicativo. No entanto, eles não são "gratuitos" - tudo o que você armazena na sessão agora deve ser serializável, e você sofrerá um pequeno impacto no desempenho, pois cada carregamento de página exigirá viagens de rede adicionais para obter e potencialmente liberará os dados da sessão.
No entanto, se você estiver em uma posição em que leva "vários minutos" para o aplicativo reiniciar após uma implantação, convém mudar para um ambiente com balanceamento de carga ou, pelo menos, uma configuração de armazenamento temporário / ativo com troca a quente (como o fornecido pelo Azure / AWS / etc.) - dessa forma, você pode colocar um servidor off-line enquanto o atualiza ou prepará-lo com o novo código e depois trocá-lo - desde que você tenha tomado as medidas necessárias para resolver os problemas compartilhados. sessões (veja acima), isso funcionará bem, sem impacto para seus usuários.