ASP.NET Servidor Side Viewstate
-
20-08-2019 - |
Pergunta
Eu li algumas abordagens para armazenar viewstate no servidor:
Mas eles são uma espécie de complicado. Eu estou procurando uma maneira de manter um objeto sem ter para serializar-lo. Eu poderia usar o estado da sessão, mas se um usuário abrir mais de uma janela, pode haver substituições do objeto.
Existe uma solução simples para isso?
Solução
Nesta situação eu iria colocar armazenar o objeto na sessão usando uma chave única e amarrar a chave para a página. Tudo isso pode ser captada em propriedades na classe de página.
public string PersistanceKey
{
get {
if(ViewState["PersistanceKey"] == null)
ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();
return (string)ViewState["PersistanceKey"];
}
}
public PersistanceObject Persistance
{
get {
if(Session[this.PersistanceKey] == null)
Session[this.PersistanceKey] = new PersistanceObject();
return (PersistanceObject)Session[this.PersistanceKey];
}
As chaves de sessão diferentes permitiria objetos diferentes em uma base por página. Como alternativa, em vez de usar o objeto de sessão, você poderia pensar em usar o cache de aplicativo (o objeto Cache) para remover automaticamente entradas velho para fora da memória, mas isso tem suas próprias advertências.
Deve-se notar que as advertências de Joel em sua resposta sobre o uso de memória são totalmente precisos. Isto pode não ser a melhor idéia para baixo memória, de alto uso ou cenários de grande persistência a objetos.
Outras dicas
Eu estou procurando uma maneira de manter um objeto sem ter para serializar-lo.
Tenha cuidado com isso. Isto terá um impacto dramático sobre a utilização de memória de seu site, e uso de memória é muitas vezes o maior impedimento para escalabilidade.
Atribuir um número a cada janela o usuário pode abrir. Anexar esse número para a chave de sessão. Você também deve armazenar a algum lugar número na página (querystring ou uma entrada escondida) para ser capaz de recuperar a variável de sessão apropriado.