Qual é a diferença entre Session.Abandon () e Session.Clear ()

109

Qual é a diferença entre destruir uma sessão e remover seus valores? Você pode fornecer um exemplo que demonstre isso?

Eu procurei essa pergunta, mas não entendi a resposta total. Algumas respostas são:

  • Session.Abandon() destrói a sessão
  • Session.Clear() apenas remove todos os valores

Um amigo me disse isso:

Limpar a sessão não cancelará a definição da sessão, ela ainda existe com o mesmo ID para o usuário, mas com os valores simplesmente limpos.

O abandono destruirá a sessão completamente, o que significa que você precisa iniciar uma nova sessão antes de armazenar mais valores na sessão para aquele usuário.

O código abaixo funciona e não lança nenhuma exceção.

Session.Abandon();
Session["tempKey1"] = "tempValue1";

Quando você Abandon () uma Session, você (ou melhor, o usuário) obterá um novo SessionId

Quando eu testo a sessão, não faz nenhuma alteração quando eu abandono a sessão.

Acabei de encontrar uma diferença: session.Abandon()aumenta o Session_Endevento

Porta dos fundos
fonte
5
Session.Clear remove itens imediatamente, mas Session.Abandon marca a sessão a ser abandonada no final da solicitação atual.
RepDbg de

Respostas:

147

Limpar - remove todas as chaves e valores da coleção de estado de sessão.

Abandonar - remove todos os objetos armazenados em uma Sessão. Se você não chamar o método Abandon explicitamente, o servidor removerá esses objetos e destruirá a sessão quando ela atingir o tempo limite.
Ele também gera eventos como Session_End .

Session.Clear pode ser comparado a remover todos os livros da prateleira , enquanto Session.Abandon é mais como jogar fora a prateleira inteira .

Você diz:

Quando eu testo a sessão, não faz nenhuma alteração quando eu abandono a sessão.

Isso está correto enquanto você está fazendo isso em apenas uma solicitação .
Na próxima solicitação, a sessão será diferente. Mas o ID da sessão pode ser reutilizado para que permaneça o mesmo.

Se você for usar Session.Clear, terá a mesma sessão em muitas solicitações.

Geralmente, na maioria dos casos, você precisa usar Session.Clear.
Você pode usar Session.Abandon se tiver certeza de que o usuário vai deixar seu site.

Então, de volta às diferenças:

  1. Abandonar levanta a solicitação Session_End.
  2. Limpar remove itens imediatamente, Abandon não.
  3. Abandon libera o objeto SessionState e seus itens para que possa ser coletado como lixo para liberar os recursos. Clear mantém SessionState e recursos associados a ele.
Dmytrii Nagirniak
fonte
e se eu chamar session.clear () isso você diz accures novamente. não? (todos os outros gerando evento Session_End)
backdoor
Session.Clear apenas removerá itens da Sessão. Nada mais. Você pode ligar quantas vezes forem necessárias.
Dmytrii Nagirniak
@AnthonyWJones, você está certo, "destruir" é incorreto dizer. Melhor é REMOVER objetos da sessão. Mas Session.Clear também não destrói objetos, ele os remove da sessão para que possam ser coletados como lixo. Além disso, armazenar objetos COMPLEXOS não é recomendado, caso contrário, considero bem.
Dmytrii Nagirniak
@Dmitriy: Por que "armazenar objetos COMPLEXOS não é recomendado"?
Kamarey
5
@Ads Eu concordo, embora deva estender isso dizendo que Session.Clearpode ser comparado a remover todos os livros da estante imediatamente , enquanto Session.Abandoné mais como dizer "jogue fora a estante inteira e me avise quando terminar ".
WynandB
20

Quando você Abandon()uma Session, você (ou melhor, o usuário) obterá um novo SessionId (na próxima solicitação). Quando você Clear()usa uma Session, todos os valores armazenados são removidos, mas o SessionId permanece intacto.

Hans Ke st ing
fonte
3
obrigado. mas acertando para o livro do Macdonalds Mattew, ele pode usar o mesmo ID de sessão. i significa que se o atributo regenerateExpiredSessionId no elemento configuration / system.web / sessionState no arquivo web.config for falso, o ASP.Net usa id de sessão antigo
backdoor
2
@Hans Kesting Ele não receberá uma nova Id de Sessão quando o abandono for chamado. Ele deve definir explicitamente o cookie ASPNET_SessionID como nulo para obter um novo ID de sessão.
Zo Has
9

Este é tipo de coberto pelas várias respostas acima, mas a primeira vez que li este artigo eu perdi um fato importante, o que levou a um pequeno bug no meu código ...

Session.Clear() LIMPAR os valores de todas as chaves, mas NÃO fará com que o evento de finalização da sessão seja acionado.

Session.Abandon()NÃO apagará os valores na solicitação atual. SE outra página for solicitada, os valores serão perdidos para aquela. Porém, abandonar VAI lançar o evento.

Então, no meu caso (e talvez no seu?), Eu precisava ser Clear()seguido por Abandon().

NRC
fonte
1
Por que você precisa de Session.Clear () seguido de Session.Abandon ()? Você está limpando valores de uma coleção que está destruindo? Isso é completamente redundante. Certifique-se de que o objeto de sessão não é destruído imediatamente (isso acontece no final da solicitação atual), mas esse id de sessão não será mais servido por qualquer solicitação subsequente. Se o cliente fizer uma nova solicitação, uma nova sessão será dada a ele. Chamar Clear primeiro também causará problemas se você quiser acessar quaisquer variáveis ​​de sessão no evento Session_End () do Global.Asax (elas não estarão lá porque você as apagou).
RepDbg de
@RepDbg na verdade eu discordo. Session.Abandon (). dá ao cliente um novo id de sessão. Session.clear limpa todas as informações sobre a sessão no servidor para que nenhum outro usuário possa.Eu concordo com NRC
Micah Armantrout
@ Micah Armantrout Não estou seguindo sua lógica. Por que limpar uma sessão com Session.Clear () e, em seguida, chamar Session.Abandon (), que não apenas limpa a sessão, mas também a desaloca completamente? Além disso, Session.Abandon () não fornece ao cliente um novo id de sessão. Uma solicitação subsequente irá, mas não o cumprimento da solicitação que chamou Session.Abandon ().
RepDbg
Se você usar apenas Session.Abandon, outra lógica restante no pipeline do ASP.NET ainda poderá acessar os valores da sessão atual.
Mark Sowul
6

este código funciona e não lança nenhuma exceção:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

É porque quando o método Abandon é chamado, o objeto Session atual é enfileirado para exclusão, mas não é realmente excluído até que todos os comandos de script na página atual tenham sido processados. Isso significa que você pode acessar variáveis ​​armazenadas no objeto Sessão na mesma página da chamada ao método Abandon, mas não em quaisquer páginas da Web subsequentes.

Por exemplo, no script a seguir, a terceira linha imprime o valor Mary. Isso ocorre porque o objeto Session não é destruído até que o servidor termine de processar o script.

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

Se você acessar a variável MyName em uma página da Web subsequente, ela estará vazia. Isso ocorre porque MyName foi destruído com o objeto de Sessão anterior quando a página contendo o exemplo anterior concluiu o processamento.

da MSDN Session.Abandon

Sete
fonte
3

Limpar uma sessão remove os valores que foram armazenados lá, mas você ainda pode adicionar novos lá. Depois de destruir a sessão, você não pode adicionar novos valores lá.

RaYell
fonte
obrigado, mas funciona: (inconsistente com a sua ideia) Session.Abandon (); Sessão ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString ());
backdoor
Isso acontece porque a sessão será destruída depois que você atualizar sua página. A ID da sessão (normalmente) é armazenada em um cookie.
RaYell
eu não entendo. quero dizer, depois de chamar Session.Abandon (), ainda posso adicionar valores a ele. (mesmo se a página for postada repetidamente e renderizada).
backdoor
1
Você pode ter sua sessão definida para autoregenerar id depois de ser destruída. Portanto, quando você atribui um valor a uma sessão destruída, uma nova sessão é gerada automaticamente.
RaYell
1
sim, usar este id de sessão irá regenerar, mas minha pergunta é: o que é diferente entre session.clear () e session.abandone () em tudo. desta forma, quando autoregenerate é definido como false, esses cabos não diferem em nada mais gerando Sesion_End?
backdoor
3

Clear-its remove a chave ou os valores da coleção de estado da sessão.

abandon-its remove ou exclui objetos de sessão da sessão.

maxy
fonte
1
Session.Abandon() 

irá destruir / matar toda a sessão.

Session.Clear()

remove / limpa os dados da sessão (ou seja, as chaves e os valores da sessão atual), mas a sessão permanecerá ativa.

Compare com o método Session.Abandon (), Session.Clear () não cria a nova sessão, apenas transforma todas as variáveis ​​na sessão em NULL.

O ID da sessão permanecerá o mesmo em ambos os casos, desde que o navegador não seja fechado.

Session.RemoveAll()

Ele remove todas as chaves e valores da coleção de estado de sessão.

Session.Remove()

Ele exclui um item da coleção de estado de sessão.

Session.RemoveAt()

Ele exclui um item em um índice especificado da coleção de estado de sessão.

Session.TimeOut()

Esta propriedade especifica o período de tempo limite atribuído ao objeto de Sessão para o aplicativo. (o tempo será especificado em minutos).

Se o usuário não atualizar ou solicitar uma página dentro do período de tempo limite, a sessão será encerrada.

Laxmi
fonte
0

Acho que seria útil usar em Session.Clear()vez de usar Session.Abandon().

Porque os valores ainda existem na sessão depois de chamar mais tarde, mas são removidos depois de chamar a primeira.

Pra
fonte
0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

Uma coisa a ser observada aqui é que Session.Clear remove itens imediatamente, mas Session.Abandon marca a sessão para ser abandonada no final da solicitação atual. Isso significa simplesmente que suponha que você tentou acessar o valor no código logo após o comando session.abandon ter sido executado, ele ainda estará lá. Portanto, não se confunda se o seu código simplesmente não está funcionando, mesmo depois de emitir o comando session.abandon e imediatamente fazer alguma lógica com a sessão.

Biki
fonte