{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
18/07/2011
Fala galera, depois de explicar como habilitar o Windows Azure AppFabric Caching no portal do Windows Azure vamos tirar proveito dele para armazenar o estado de nossas sessões em aplicações ASP.NET no Windows Azure.
Quando estamos em um ambiente como o Windows Azure onde normalmente trabalharemos com mais de uma máquina(instância) para nossas aplicações os requests que fizermos aos nossos sites poderão ser encaminhados para qualquer uma destas máquinas.Quem faz este trabalho é um Load Balancer já configurado no Windows Azure. Veja a ilustração abaixo para entender como isso funciona:
Isto quer dizer que nosso request pode retornar da máquina 1. Quando pressionarmos um botão ele pode retornar para a máquina 2, e quando puxarmos um relatório ele pode vir da máquina N. Com isso precisamos mudar o mecanismo de sessões do ASP.NET.A solução para estes cenários é utilizar um mecanismo de armazenamento de sessões que seja persistente e independente de máquina. Um cache distribuído ou um banco de dados são soluções comuns. E é aqui que usarmos o Windows Azure AppFabric Caching pois por ser um mecanismo de caching distribuído qualquer uma de nossas instâncias(ou máquinas) fará acesso ao mesmo cache, assim se cairmos na máquina 1 ou na máquina N teremos acesso aos objetos de Session.
A primeira coisa que precisamos fazer é referenciar 3 DLLs do SDK do Windows Azure AppFabric. Se você ainda não instalou faça o download aqui e instale.As 3 DLLs que precisaremos são: Microsoft.ApplicationServer.Caching.Core, Microsoft.ApplicationServer.Caching.Client e Microsoft.Web.DistributedCache que podem ser encontradas em: Program Files\Windows Azure AppFabric SDK\V1.0\Assemblies\NET4.0\Cache. Após adicionar estas DLLs altere sua propriedade "Copy Local" para true.
Após adicionarmos as DLLs precisamos colocar algumas informações no web.config da nossa aplicação. Estas informações para o web.config dirão para a aplicação que estamos utilizando o Windows Azure AppFabric Caching e que estamos utilizando-o como Provider para o SessionState.O próprio portal do Windows Azure te fornece estar informações:
Agora vamos configurar tudo. Primeiro adicione as linhas abaixo logo após a tag <
configuration>
no seu web.config:
<configsections> <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowlocation="true" allowdefinition="Everywhere" /></configsections>
Se você já tiver uma área <
configSections>
apenas adicione a linha <
section>
:
<section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowlocation="true" allowdefinition="Everywhere" />
Isto apenas cria uma section para preenchermos informações do Windows Azure AppFabric Caching. É uma forma de estender as configurações do web.config.Agora adicione o seguinte trecho dentro de <
system.web>
:
<providers> <add name="AppFabricCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cachename="default" useblobmode="true" datacacheclientname="default" /> </providers></sessionstate>
Este trecho diz pra o ASP.NET que deve utilziar o AppFabricCacheSessionStoreProvider que está no assembly Microsoft.Web.DistributedCache.E agora vamos inserir as informações da nossa conta no Windows Azure AppFabric Caching. Este trecho pode ser adicionado logo antes de <
/configuration>
:
</messagesecurity> </securityproperties> </datacacheclient></datacacheclients>
O Token pode ser obtido nas informações de Configuração de Cliente da imagem acima ou também através do botão:
Pronto! Agora tudo está configurado e funcionando. Nada precisa ser alterado no seu código continue acessando o objeto Session da mesma forma:
protected void Page_Load(object sender, EventArgs e){ Session["AppFabricCaching"] = "Windows Azure AppFabric Caching para SessionState Provider";
}
protected void ExibirSession_Click(object sender, EventArgs e){ this.SessionContent.Text = Session["AppFabricCaching"].ToString();
}
Não pense que isso não é algo importante: é! Se você subir qualquer site no Windows Azure que vá ser executado em mais de uma instância você precisará de um mecanismo de session persistente e que possa atender qualquer uma das instâncias de forma transparente. Caso você não faça isso suas sessions se perderão e você terá comportamentos estranhos e indesejados no seus sistema.Esta não é a única forma de fazer isso mas é uma das mais simples por já haver um provider disponibilizados pela Microsoft executando no ambiente do Windows Azure.
É preciso que você crie um mecanismo para apagar as sessions que já estiverem expiradas, caso contrário elas permanecerão no cache ocupando espaço. Mas isso é assunto para outro post.
Abraços, Vinicius Quaiato.