Como todos sabemos, não é fácil implementar uma aplicação que funcione 24 horas por dia, 7 dias por semana. Certa vez, um de meus projetos persistiu por mais de 20 horas sob carga violenta e ainda assim morreu heroicamente. Felizmente, o ASP.NET e o IIS nos fornecem alguns recursos fáceis que nos permitem construir facilmente aplicativos .Net superestáveis. No entanto, o que é um pouco desagradável é que os métodos de configuração nos sistemas Windows 2000 (versões abaixo do IIS6.0) e Windows 2003 (IIS6.0) são diferentes.
Vamos falar primeiro sobre o sistema Windows 2000. Todos aqueles que estão familiarizados com ASP.NET devem conhecer o arquivo machine.config. Ele está armazenado no diretório %WindowPath%Microsoft.NetFramework%.NetVersion%CONFIG. Use qualquer editor de texto (claro que o mais popular é o "Bloco de Notas") para abrir o arquivo e encontrar a seção <processModel...>. O ASP.NET controla o processo do serviço ASP.NET (aspnet_wp.exe ou w3wp.ext) com base nas configurações desta seção. O código do aplicativo ASP.NET que escrevemos é executado neste espaço de processo. Se você estiver usando o Framework 1.1, verá mais de n propriedades nesta seção. Estamos preocupados com as três seguintes, seguidas do sinal de igual como seus valores padrão:
timeout="Infinite"
idleTimeout="Infinite"
memoryLimit="60"
Você não pode vê-los no Framework 2.0, mas pode adicioná-los manualmente.
Deixe-me traduzir o significado desses três atributos. Depois de executar continuamente pelo tempo especificado pelo tempo limite, reinicie o processo do serviço ASP.NET. O valor padrão do tempo limite é infinito. " , por exemplo, timeout=24:00:00 significa reiniciar após 24 horas; Se ninguém acessar dentro do tempo especificado por idleTimeout, reinicie o processo do serviço ASP.NET. O valor padrão de idleTimeout também é infinito, e o método de configuração é como acima; se a porcentagem de memória usada pelo processo do serviço ASP.NET em relação à memória total do sistema exceder a quantidade especificada por memoryLimit, o processo do serviço ASP.NET será reiniciado.
Entenda, através da cooperação desses três atributos, o processo do serviço pode ser reiniciado sem saber, para que nossa aplicação possa continuar rodando. Quando digo isso, leitores atentos podem ter descoberto o problema. Quando o processo do serviço for reiniciado, a sessão do cliente será inevitavelmente perdida e a operação do usuário será interrompida. Como podemos alcançar “Deus não sabe e os fantasmas não sabem”?
Este problema existe, mas seu impacto pode ser minimizado ou até mesmo eliminado completamente pelas seguintes medidas:
Primeiro, podemos definir odleTimeout para um valor razoável, normalmente vou defini-lo para 1,5-1,5 da configuração de tempo limite da sessão 3 vezes. Defina o tempo limite para o limite máximo que o programa pode persistir. Normalmente defino para 24 horas. Isso forçará a reinicialização do processo do serviço quando estiver ocioso. Como não há sessão neste momento, é impossível interromper a operação do usuário. Esta configuração é muito eficaz em um ambiente de escritório de pequenas e médias empresas, porque basicamente não há acesso após o expediente.
É claro que o método acima tem grandes limitações e só pode funcionar em situações específicas. Se alguém continuar acessando ou reiniciando quando a memória exceder o limite, a operação do usuário ainda sofrerá interferência. Uma solução definitiva é salvar o estado da sessão em um processo separado. No ASP.Net isso também é possível com configuração simples.
Fonte: Sala de gravação do BLOG