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 : &nbsp;
<asp:Label ID="lblContador" runat="server" Text="Label" Width="97px"></asp:Label>&nbsp;
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..