ASP.NET 2.0 - Apresentando com o objeto Application
Você pode armazenar variáveis e objetos que você pretende usar durante toda a aplicação em um objeto especial chamado Application.
Os dados armazenados neste objeto são chamados de estado da aplicação. O objeto Application também fornece métodos que permitem compartilhar os dados do estado da aplicação com todas as páginas em uma aplicação ASP.NET.
O estado da aplicação esta intimamente relacionado com outro conceito: o conceito de Sessão.
A principal diferença entre estes dois conceitos é que o estado da sessão armazena variáveis e objetos para um usuário particular e existe enquanto a sessão do usuário existir ao passo que o estado da aplicação armazena variáveis e objetos que são compartilhados com todos os usuários da aplicação ao mesmo tempo.
Assim, o estado da aplicação é ideal para armazenar dados que serão usados por todos os usuários de uma mesma aplicação.
Na ASP.NET 2.0 tanto o objeto Session como o objeto Application são implementados como coleções ou conjunto de pares nome-valor. Vejamos um exemplo de como usar este recurso: Para definir o valor de uma variável de aplicação chamada nomeSite fazemos assim:
VB Application("nomeSite") = "Macoratti.net - Intranet" C# Application["nomeSite"] = "Macoratti.net - Intranet"; |
Após definirmos a variável nomeSite no objeto Application qualquer página na aplicação poderá obter o valor da variável da seguinte forma:
VB Dim appNome As String = Application("nomeSite") C# String appNome = Application["nomeSite"]; |
Para remover um objeto definido no estado da aplicação usando o método Remove:
VB Application.Remove("SiteName") C# Application.Remove("SiteName"); |
Se você desejar remover todos os objetos e variáveis de aplicação já definidos no estado da aplicação de uma vez só poderá usar o método RemoveAll:
VB Application.RemoveAll() C# Application.RemoveAll(); |
Você deve ser cauteloso ao usar variáveis de aplicação pois os objetos permanecem no estado da aplicação até que você os remova através dos métodos Remove ou RemoveAll, ou , pare a aplicação através de um shutdown do servidor IIS.
Se você não atentar para este detalhe e definir muitas variáveis ou objetos no estado da aplicação sem removê-los poderá haver uma grande demanda de recursos do servidor o que poderá afetar o desempenho da sua aplicação.
O estado da aplicação é muito usado para manter contadores de acesso a páginas, vejamos a seguir um exemplo de como implementar esta funcionalidade em uma página ASP.NET.
Abra o Visual Web Developer 2005 Express Edition e crie um novo web site chamado usandoApplication
Selecione a página Default.aspx e no modo Design inclua um controle Label no formulário definindo sua propriedade ID para lblContador e incluindo o seguinte texto :"Esta página foi vista : vezes"
Abaixo temos a imagen e o código da página Default.aspx:
<html
xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Contador</title> </head> <body> <form id="form1" runat="server"> <div> <br /> Esta página foi vista : <asp:Label ID="lblContador" runat="server" Text="Label" Width="97px"></asp:Label> vezes.</div> </form> </body> </html> |
Vamos modificar o código do arquivo code-behind para usar uma variável de aplicação que irá exibir o número de vezes que a página foi acessada.
Clique duas vezes sobre uma área vazia do formulário pra exibir o evento Load da página e vamos incluir o seguinte código neste evento:
Protected Sub
Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load ' Zera o contado quando o seu valor for igula a 10 If Application("contadorPagina") >= 10 Then Application.Remove("contadorPagina") End If ' Inicializa ou incrementa o contadode páginas cada vez que a página for carregada If Application("contadorPagina") Is Nothing Then Application("contadorPagina") = 1 Else Application("contadorPagina") += 1 End If ' Exibe o contador lblContador.Text = Application("contadorPagina") End Sub |
Vamos rodar a aplicação pressionando F5. A cada refresh de página que é efetuado a o contador será incrementado de uma unidade até alcançar o valor de 10, quando será reiniciado. Como armazenamos a variável no estado da aplicação se você fechar o navegador e abrir novamente o valor da variável será recuperado da aplicação. Para zerar o valor da variável a estamos removendo da aplicação.
Embora o código acima funcione temos um problema a resolver: O acesso simultâneo.
Imagine que dois usuários estejam visitando a página ao mesmo tempo e que o servidor web processe a requisição do primeiro usuário uma fração de segundos antes do segundo usuário efetuar a sua requisição.
O formulário web que foi carregado pelo primeiro usuário pode ler o contador de páginas do estado da aplicação e obter o valor 4, o qual será incrementado o valor de uma unidade obtendo assim 5.
Porém, antes do formulário armazenar este novo valor no estado da aplicação , outra copia do formulário, rodando na maquina do segundo usuário, poderá ler o contador de páginas e também obter o valor 4. Desta forma ambos os formulários terão o mesmo valor e irão armazenar o valor incrementado igual a 5 no estado da aplicação. Assim o valor armazenado no estado da aplicação será igual a 5 e não igual a 6 como deveria.
Para evitar este problema devemos bloquear o estado da aplicação quando o mesmo estiver sendo atualizado e liberar em seguida para outro usuário tenha acesso ao objeto Application.
O código usando este recurso é mostrado a seguir:
'
Inicializa ou incrementa o contador de páginas If Application("PageCounter") Is Nothing Then Application("PageCounter") = 1 Else 'Bloqueia o objeto Application Application.Lock() ' Incrementa o contador Application("PageCounter") += 1 ' Desbloqueia o objeto Application Application.UnLock() End If |
O método Lock garante que somente um usuário poderá acessar a variável da aplicação, e, em seguida o método Unlock libera a variável da aplicação para a próxima requisição. Desta forma estamos garantindo que o incremento seja realmente contado a cada visita de um usuário a página,
Da mesma forma que o estado da aplicação, o estado da sessão é uma importante forma de armazenar informação através de requisições em múltiplas páginas.
Cada objeto armazenado no estado da sessão esta associado com um usuário em particular e não a toda a aplicação. Assim, armazenada no servidor , cada estado da sessão aloca memória para armazenar de forma temporária os objetos da sessão. A forma de armazenar objetos é a mesma usada no estado da aplicação onde é usado o objeto Session, sendo que objeto Session não suporta o bloqueio e o desbloqueio da sessão.
Falaremos mais sobre o objeto Session em outro artigo. Até lá...
Eu sei é apenas ASP.NET, mas eu gosto..