O Hypertext Transfer Protocol (HTTP) é um protocolo sem estado. Quando o cliente se desconecta do servidor, o mecanismo ASP.NET descarta o objeto de página. Dessa forma, cada aplicação web pode ser dimensionada para atender um grande número de solicitações simultaneamente, sem esgotar a memória do servidor.
No entanto, alguma técnica é necessária para armazenar as informações entre as solicitações e recuperá-las quando necessário. Essa informação é chamada de estado, que são os valores atuais de todos os controles e variáveis utilizadas pelo usuário atual na sessão atual.
ASP.NET gerencia quatro estados:
ver estado
estado de controle
estado da sessão
Status do aplicativo
O estado de visualização é o estado da página e de todos os seus controles. Ele permanece inalterado através dos comentários do framework ASP.NET.
Quando uma página é enviada de volta ao cliente, as propriedades e os controles dessas alterações de página são determinados e armazenados no valor de um campo de entrada oculto denominado _VIEWSTATE. Quando a página é postada novamente, o campo _VIEWSTATE é enviado ao servidor com a solicitação HTTP.
O estado de visualização pode ser ativado ou desativado para:
Aplicativo inteiro : defina a propriedade EnableViewState da seção no arquivo web.config.
Uma página : defina a propriedade EnableViewState do comando de página como <%@ Page Language="C#" EnableViewState="false" %>
Um controle : defina a propriedade control.EnableViewState.
Isso é feito usando um objeto de estado de visualização, que é definido por uma classe StateBag definida por um conjunto de itens de estado de visualização. O StateBag é uma estrutura de dados que contém pares de valores de propriedades e é armazenada como uma string associada a um objeto.
A classe StateBag possui as seguintes propriedades:
propriedade | descrever |
---|---|
Item(nome) | O valor do estado de visualização com o nome especificado, que é a propriedade padrão do StateBag. |
Contar | O nome do item na coleção de status. |
Chaves | Uma coleção de chaves para todos os itens da coleção. |
Valores | A coleção de valores para todos os itens da coleção. |
A classe StateBag possui os seguintes métodos:
método | descrever |
---|---|
Adicionar(nome, valor) | Adiciona um item à coleção viewstate, atualizando os itens existentes. |
Claro | Remove todos os itens da coleção. |
Igual (Objeto) | Determina se o objeto especificado é igual ao objeto atual. |
Finalizar | Permite que recursos sejam liberados e outras operações de limpeza sejam executadas. |
GetEnumerator | Retorna um contador de pares chave/valor para objetos StateItem duplicados armazenados no objeto StateBag. |
GetType | Obtenha o tipo da instância atual. |
IsItemDirty | Verifique o objeto armazenado no StateBag para confirmar se ele foi modificado. |
Remover(nome) | Remova itens personalizados. |
Definir sujo | Define o estado do objeto StateBag e a propriedade Dirty de cada objeto StateItem contido. |
SetItemDirty | Define a propriedade Dirty para o objeto StateItem especificado no objeto StateBag. |
ParaString | Retorna uma string que representa o objeto do pacote de status. |
O exemplo a seguir ilustra o conceito de strings que armazenam o estado de visualização.
Vamos manter um contador que pode ser incrementado toda vez que a página é chamada de volta clicando em um botão na página. O controle rótulo exibe o valor do contador.
O código do arquivo de tags é assim:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
O arquivo code-behind para esta instância é semelhante a este:
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
Produzirá os seguintes resultados:
Os estados de controle não podem ser diretamente modificados, acessados ou desabilitados.
Quando um usuário se conecta a um site ASP.NET, um novo objeto de sessão é criado. Quando o estado da sessão está ativado, um novo estado de sessão é criado para cada nova solicitação. Este objeto de estado de sessão torna-se parte do ambiente de tempo de execução e fica disponível por meio da página.
O estado da sessão normalmente é usado para armazenar dados do aplicativo, como inventário, listas de fornecedores, registros de clientes ou carrinhos de compras. Ele pode armazenar as informações do usuário e suas preferências e salvar o caminho indeciso do usuário.
As sessões são identificadas e rastreadas por um SessionID de 120 bits, passado do cliente para o servidor e retornado como um cookie ou URL modificado. SessionID é globalmente único e aleatório.
Os objetos de estado de sessão são criados pela classe HttpSessionState, que define uma coleção de itens de estado de sessão.
A classe HttpSessionState possui as seguintes propriedades:
propriedade | descrever |
---|---|
ID da sessão | Identificador de sessão exclusivo. |
Item(nome) | O valor do item de estado da sessão com o nome especificado, que é a propriedade padrão da classe HttpSessionState. |
Contar | O número de itens na coleção de estado da sessão. |
Tempo esgotado | Obtém e define o tempo, em minutos, permitido entre solicitações antes que o provedor interrompa o estado da sessão. |
A classe HttpSessionState possui os seguintes métodos:
método | descrever |
---|---|
Adicionar(nome, valor) | Adiciona novos itens à coleção de estado da sessão. |
Claro | Remove todos os itens da coleção de estado da sessão. |
Remover(nome) | Remove o item especificado da coleção de estado da sessão. |
Remover tudo | Remove todas as chaves e valores da coleção de estados da sessão. |
RemoverEm | Remove o item no índice especificado da coleção de estado da sessão. |
Um objeto de estado de sessão é um par nome-valor que pode armazenar e recuperar informações de um objeto de estado de sessão. Da mesma forma, você pode usar o seguinte código:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
O código acima armazena apenas strings no objeto de dicionário de sessão, no entanto, ele pode armazenar todos os tipos de dados primitivos e matrizes compostas de tipos de dados primitivos, DataSet, DataTable, HashTable e objetos de imagem, bem como quaisquer objetos definidos pelo usuário que herdam de Tipo de objetos ISerializáveis.
O exemplo a seguir ilustra o conceito de armazenamento do estado da sessão. Existem dois botões na página: um botão de caixa de texto para inserir uma string e um botão de rótulo para exibir o texto armazenado da última sessão. O código do arquivo de tags é assim:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
Deve ficar assim na visualização do design:
O código de fundo é o seguinte:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
Execute o arquivo e observe como ele funciona:
Um aplicativo ASP.NET é uma coleção de todas as páginas da Web, códigos e outros arquivos em um único diretório virtual em um servidor Web. Quando as informações são armazenadas no estado do aplicativo, elas ficam disponíveis para todos os usuários.
Para fornecer o uso do estado do aplicativo, o ASP.NET cria um objeto de estado do aplicativo para cada aplicativo da classe HttpApplicationState e armazena o objeto na memória do servidor. Este objeto é representado pelo arquivo de classe global.asax.
O estado do aplicativo é usado principalmente para armazenar contadores, outros dados estatísticos e todos os dados do aplicativo, como taxas de impostos e taxas de desconto, e para armazenar o caminho do usuário até o site.
A classe HttpApplicationState possui as seguintes propriedades:
propriedade | descrever |
---|---|
Item(nome) | O valor da entrada do aplicativo com o nome especificado, que é a propriedade padrão de HttpApplicationState. |
Contar | O número de itens na coleção de estado do aplicativo. |
A classe HttpApplicationState possui os seguintes métodos:
método | descrever |
---|---|
Adicionar(nome, valor) | Adiciona novos itens à coleção de estado do aplicativo. |
Claro | Remove todos os itens da coleção de estado do aplicativo. |
Remover(nome) | Remove o item especificado da coleção de estado do aplicativo. |
Remover tudo | Remove todos os objetos em uma coleção HttpApplicationState. |
RemoverEm | Remove um objeto HttpApplicationState da coleção encontrada pelo índice. |
Trancar() | Bloqueie a coleção de estados do aplicativo para que somente o usuário atual possa acessá-la. |
Desbloquear() | Desbloqueie a coleção de estados do aplicativo para que todos os usuários possam acessá-la. |
Os dados de estado do aplicativo normalmente são mantidos por manipuladores escritos para eventos:
O aplicativo é aberto
A inscrição termina
erro de aplicativo
A sessão começa
sessão encerrada
O trecho de código a seguir mostra a sintaxe básica para armazenar informações de estado do aplicativo:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}