Este é o sétimo de uma série de posts que estou escrevendo sobre o
próximo lançamento do VS 2010 e .NET 4.
Eu vou mudar o foco dos
posts e ao invés de escrever sobre novos recursos de ferramentas do VS
2010, escreverei alguns posts que cobrem novos recursos do motor de
execução (não se preocupe – eu
voltarei a escrever sobre muitos outros recursos do VS. Eu estou
simplesmente tentando misturar um pouco as coisas).
O
post de hoje cobre um recurso pequeno, mas legal, que você agora pode
opcionalmente tirar proveito usando a ASP.NET 4 - a
capacidade de inicializar automaticamente e
proativamente ativar uma aplicação web sem ter que aguardar o acesso de
um cliente externo ao servidor. Isto pode te ajudar a prover uma
experiência de resposta rápida para o primeiro usuário que acessar o
servidor, e evita que você escreva scripts customizados para "aquecer" o
servidor e ter todo o cache de dados pronto. Isto funciona com todos
os tipos de aplicação ASP.NET
– incluindo ambas as
aplicações baseadas em Formulários Web
ASP.NET e ASP.NET MVC.
Auto-Inicialize Aplicações Web com a ASP.NET 4
Algumas
aplicações web precisam carregar grandes quantidades de dados ou
executar um processamento de inicialização custoso antes de estarem
prontas para processar requisições. Desenvolvedores que usam ASP.NET hoje geralmente fazem
este trabalho usando o tratador de evento "Application_Start" que fica
dentro do arquivo Global.asax da aplicação (o qual é ativado na primeira
vez que uma requisição é executada). Eles geralmente seguem dois
caminhos: criam scripts customizados para enviar requisições falsas para
aplicação periodicamente "acorde a aplicação" e executam este código
antes que um cliente acesse o servidor, ou simplesmente fazem com que o
usuário desafortunado que acessa a aplicação pela primeira vez aguarde
enquanto a lógica termina antes de processar a requisição (o que pode
gerar um longo delay (atraso) para o cliente/usuário).
A ASP.NET
4 vem com um novo recurso chamado "auto-start" ou auto-inicialização
que melhor endereça este cenário e está disponível quando a ASP.NET 4 roda no IIS 7.5 (o
qual acompanha o Windows 7 e o Windows Server 2008 R2). O recurso de
auto-inicialização provê uma abordagem controlada para iniciar o worker
process (processo que executa todas as funcionalidades da ASP.NET) de
uma aplicação, iniciando uma aplicação ASP.NET e então aceitando requisições HTTP.
Configurando uma Aplicação ASP.NET 4 para Auto-Inicializar
Para usar o recurso de
auto-inicialização da ASP.NET
4, você primeiramente configura o worker process do "application pool"
do ISS no qual sua aplicação está incluída para que o worker process
seja automaticamente inicializado na primeira vez em que o servidor web
for carregado. Você pode fazer isto abrindo o arquivo
applicationHost.config do IIS 7.5
(C:\Windows\System32\inetsrv\config\applicationHost.config) e
adicionando um atributo startMode=”AlwaysRunning” na entrada da propriedade
<applicationPools>:
<applicationPools>
<add name="MyAppWorkerProcess"
managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>
Abra o gerenciador de tarefas do
Windows e clique na checkbox "mostrar processos de todos os usuários".
Salve as mudanças efetuadas no arquivo applicationHots.config. Você verá
que um novo worker process chamado "w3wp.exe" imediatamente será
inicializado no exato momento em que o arquivo é salvo.
Um único worker
process de um pool de aplicações do IIS pode conter múltiplas aplicações
ASP.NET. Você pode
especificar quais aplicações você quer automaticamente inicializar
quando o worker process for executado adicionando um atributo serviceAutoStartEnabled="true" na entrada da configuração da aplicação
<application>:
<sites>
<site name="MySite" id="1">
<application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" />
</site>
</sites>
<serviceAutoStartProviders>
<add name="PreWarmMyCache"
type="PreWarmCache, MyAssembly" />
</serviceAutoStartProviders>
O atributo serviceAutoProvider="PreWarmMyCache"
acima faz referência a uma entrada de provedor dentro do arquivo de
configuração que permite a você configurar uma classe customizada que
pode ser usada para encapsular qualquer lógica de "aquecimento" para a
aplicação. Esta classe pode ser automaticamente invocada tão logo o
worker process e a aplicação sejam pré-carregados (antes que uma
requisição web externa seja recebida), e pode ser usada para executar
qualquer inicialização ou lógica para o carregamento do cache que você
queira antes que requisições sejam recebidas e processadas:
public
class PreWarmCache :
System.Web.Hosting.IProcessHostPreloadClient
{
public void
Preload(string[] parameters)
{
// Execute lógica de inicialização e carregamento de cache aqui...
}
}
O IIS inicializará a aplicação em
um estado durante o qual a aplicação não aceitará requisições até que
sua lógica de "aquecimento" seja executada. Após o seu código de
inicialização ter sido executado no método Preload e o método retornar, a
aplicação ASP.NET será marcada como pronta para receber requisições.
Você pode opcionalmente combinar o novo recurso de auto-inicialização
com as capacidades de balanceamento de carga da extensão
Roteamento de Requisições da Aplicação do IIS7 e
usá-la para sinalizar a um balanceador de carga quando a aplicação
estiver inicializada e pronta para receber tráfego HTTP – no exato ponto em que o servidor pode ser trazido para o
web farm (fazenda de servidores web) para processar requisições.
Sumário
O novo recurso de auto-inicialização da ASP.NET 4 e do
IIS 7.5 provê uma abordagem bem definida que permite a você rodar uma
inicialização custosa para a
aplicação e lógica de pré-cache que podem ser executadas antes que
qualquer usuário final acesse sua aplicação. Isto permite a você ter sua
aplicação "aquecida" e pronta desde o começo para entregar uma
experiência consistente de alta performance.
Espero que ajude,
Scott
P.S. Além de
escrever posts neste
blog, eu tenho usado o Twitter mais
recentemente para disponibilizar posts rápidos e compartilhar links.
Você pode me seguir no Twitter em http://www.twitter.com/scottgu
(@scottgu é o meu nome no Twitter).
Texto
traduzido do post original por Leniel Macaferi.