Como manter os conjuntos ASP.NET no AppDomain vivo?
-
10-07-2019 - |
Pergunta
Cenário: Eu tenho uma aplicação ASP.NET empresa n-Tier implantado usando Web Deployment Projects. Todos os níveis produzir montagens independentes que é consumido pela aplicação ASP.NET.
Problema: Quando eu executar o aplicativo. pela primeira vez após a implantação leva muito tempo para carregar assemblies dependentes na memória. Mas uma vez carregado o seu aplicativo rápido iluminação. No caso, se não há usuários que acessam o aplicativo, o IIS descarrega as assembleias da memória e quando um usuário tentou acessar o aplicativo em uma instância mais tarde ele vai para carregar todas as igrejas, mais uma vez levando a mesma quantidade de tempo para carregar, pois leva a fazê-lo pela primeira vez.
Eu estou procurando uma solução que me permite manter minha assembléias carregado na memória persistente substituindo a natureza volátil dos conjuntos no sentido de residência memória.
ou qualquer outra solução que permite que meus usuários felizes para usar o aplicativo resolver o problema mencionado.
Solução
Em IIS 6 , vá para a seção Application Pools, e clique com o botão direito> Propriedades no piscina, que hospeda o aplicativo ASP.NET em questão. Vá para a guia Desempenho e desmarque "processos de trabalho Shutdown depois de ficar ocioso para:"
Em IIS 7 , vá para o painel de conexões, encontrar Pools de Aplicativos, e selecione Configurações avançadas para a piscina, que hospeda o aplicativo. Encontre a propriedade "Tempo limite ocioso" e configurá-lo para "0" (Isso desativa-lo).
O padrão é 20 minutos de inatividade. Desmarcando a caixa, uma vez que seu AppDomain é carregado pelo trabalhador processo , ele nunca vai morrer (a menos que você matar o processo ou algo assim, é claro). Por padrão, o IIS reciclar o processo quando atinge um limite, como um limite de memória, mas que também irá começar um novo e 'fase mais' todas as solicitações recebidas até o antigo não é utilizada, de modo a minimizar a interrupção.
Eu também tenho escrito uma pequena # classe c que irá manter seu ASP.NET aplicativo vivo ( alternativo arquivado versão ) sob condições normais circunstâncias. Uma vez que é executado dentro do aplicativo, obviamente, não pode parar o IIS ou qualquer outra coisa de matar explicitamente o processo, mas vai manter o aplicativo "quente", por exemplo, o aplicativo nunca vai dar bastante longa ocioso para o IIS para decidir a desligá-lo.
Se você não tem controle direto sobre a configuração do IIS (servidor compartilhado, por exemplo) a sua melhor aposta é ter um pequeno aplicativo em execução em um sistema separado - digamos, um sempre-em estação de trabalho - que atinge seu site a cada x minutos para manter o pool de aplicativos a partir do tempo limite. Nada extravagante - um simples WebRequest e um tempo () circuito em um aplicativo de console vai fazer.
Outras dicas
Uma das vantagens do ASP NET é a posibilidade de criar estático (compartilhado) instâncias de objetos.
Para evitar a necessidade de um processo externo você pode criar um temporizador estática em (por exemplo) global.asax que apela a uma página no domínio com um WebRequest simples. Nesta forma como o site mantém viva a si mesmo até que um reset manual da piscina é feito.
Eu escrevi um pouco de C # aplicação de consola que mantém meus 4 locais vivos a cada 10 minutos via agendador de tarefas do Windows. A vida é, mais uma vez boa. Nós não executar o aplicativo a partir de 2-5am apenas para que os saques podem fazer quaisquer limpezas de memória, se ele ainda importa. para nossos sites raramente há alguém em pelo aquelas horas de qualquer maneira.