Pergunta: Por que a sessão é ocasionalmente perdida em algumas máquinas?
Resposta: Pode estar relacionado ao ambiente da máquina, como firewall ou software antivírus. Tente desligar o firewall.
P: Por que o método Session_End não é acionado quando Session.Abandon é chamado?
Resposta: Em primeiro lugar, o método Session_End suporta apenas Sessão do tipo InProc (em processo). Em segundo lugar, para ativar o método Session_End, a Sessão deve existir (ou seja, a Sessão foi utilizada no sistema) e pelo menos uma solicitação deve ser concluída (este método será chamado nesta solicitação).
P: Por que minha sessão é frequentemente perdida quando a uso no modo InProc?
Resposta: Esse problema geralmente é causado pela reciclagem do aplicativo, pois ao usar a Sessão em processo, a Sessão é salva no processo aspnet_wp. Quando o processo é reciclado, a Sessão irá naturalmente desaparecer. foi reciclado, você pode usar Verifique o Visualizador de Eventos do seu sistema para obter informações.
Para informações específicas, consulte:
Variáveis de sessão são perdidas intermitentemente em aplicativos ASP.NET
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
Também havia um bug na versão 1.0 que fazia com que o processo de trabalho fosse reciclado e reiniciado. Esse bug foi corrigido na versão 1.1 e no sp2.
Para obter informações detalhadas sobre esse bug, consulte:
O processo de trabalho do ASP.NET (Aspnet_wp.exe) é reciclado inesperadamente.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
Pergunta: Por que o ID da nova sessão é igual ao original depois que a sessão expira ou é abandonada?
Resposta: Como o SessionID é salvo na instância do navegador do cliente, quando a Sessão expira e a Sessão é restabelecida no servidor, o ID da Sessão passado pelo navegador será usado. o ID da sessão não será alterado após ser restabelecido.
P: Por que o SessionID é diferente para cada solicitação?
Resposta: Este problema pode ser causado por não salvar nenhuma informação na Sessão, ou seja, a Sessão não é utilizada em nenhum lugar do programa. Após as informações serem salvas na Sessão, o SessionID estará sempre relacionado ao navegador, e o SessionID não será alterado neste momento.
P: A sessão pode ser compartilhada entre ASP e ASP.NET?
Resposta: Sim. Mas este é um processo relativamente complicado. A Microsoft fornece uma solução oficial. Consulte: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET .aspQ.
: Que tipos de objetos podem ser salvos na Sessão?
Resposta: Isso depende do modo de sessão usado. Ao usar uma sessão em processo (InProc), qualquer objeto pode ser facilmente salvo. Se você usar um modo não InProc, só poderá salvar objetos que podem ser serializados e desserializados. Se o objeto salvo neste momento não suportar serialização, ele não poderá ser salvo na sessão deste modo (não InProc).
P: Por que não posso usar os métodos Response.Redirect e Server.Transfer em Session_End para ir para uma página?
Resposta: Session_End é uma função de processamento de eventos disparada dentro do servidor. É baseado em um timer dentro do servidor. Quando o evento é disparado, não há nenhum objeto HttpRequest relevante no servidor, portanto os métodos Response.Redirect e Server.Transfer não podem ser usados neste momento.
P: Posso obter o objeto HttpContext em Session_End?
Resposta: Não, pois este evento não está associado a nenhuma solicitação (Request) e não possui contexto baseado em solicitação.
Pergunta: Como usar Session em Web Service?
Resposta: Para usar a Sessão no Web Service, o chamador do Web Service precisa fazer algum trabalho extra, e o Cookie usado ao chamar o Web Service deve ser salvo e armazenado. Para obter detalhes, consulte a documentação do MSDN para a propriedade HttpWebClientProtocol.CookieContainer. Porém, se você utilizar um servidor proxy para acessar o Web Service devido a limitações da estrutura, os dois não poderão compartilhar a Sessão.
Descrição: Por que não posso usar Session ao personalizar meu próprio HttpHandler?
Resposta: Ao implementar seu próprio HttpHandler, se você quiser usar Session, você deve implementar uma das duas interfaces de marcação a seguir: IRequiresSessionState e IReadOnlySessionState. Essas interfaces não possuem nenhum método que precise ser implementado. o método de uso da interface INamingContainer.
P: Quando uso o webfarm, por que a sessão é perdida quando redireciono para outro servidor web?
Resposta: Para obter informações detalhadas, consulte:
PROBLEMA: O estado da sessão é perdido no Web Farm se você usar o modo de sessão SqlServer ou StateServer
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056Q
: Por que minha sessão é inválida no método Application_OnAcquireRequestState?
Resposta: A sessão só será válida após a chamada do evento HttpApplication.AcquireRequestState.
Para informações detalhadas consulte:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
P: Como direciono de uma página HTTP para HTTPS se o cookieless for usado?
Resposta: Por favor, tente os seguintes métodos:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String modificadaUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
P: A sessão é válida nesses eventos em global.asax?
Resposta: A sessão só é válida após o evento AcquireRequestState, e os eventos após esse evento podem usar a Sessão.
P: Como salvar todos os objetos na sessão atual?
Resposta: Pode ser obtido percorrendo todas as Session.Keys. O código é o seguinte:
ArrayList sessionCollection = new ArrayList();
foreach (string strKey em Session.Keys){
sessionCollection.Add(Sessão[strKey]);
}
P: É possível compartilhar sessões em diferentes aplicações?
Resposta: Não pode ser compartilhado diretamente. Você pode consultar como compartilhar sessão entre ASP e ASP.NET.
P: Qual é a diferença entre Session.Abandon e Session.Clear?
Resposta: A principal diferença é que ao usar Session.Abandon, o método Session_End (no modo InProc) é chamado. O método Session_Start será acionado quando a próxima solicitação chegar. Session.Clear apenas limpa todos os dados da Sessão e não encerra a Sessão, portanto, esses métodos não serão chamados.
Pergunta: Para acessar o valor do status da Sessão sequencialmente, a Sessão fornece um mecanismo de bloqueio?
Resposta: A sessão implementa o mecanismo de bloqueio do leitor/gravador:
Quando a página possui recursos graváveis para a Sessão (ou seja, a página possui a tag <%@ Page EnableSessionState="True" %>), a Sessão da página mantém um bloqueio de gravação até que a solicitação seja concluída.
Quando a página possui funcionalidade somente leitura para a Sessão (ou seja, a página possui a tag <%@ Page EnableSessionState="ReadOnly" %>), a Sessão que solicitou a conclusão da página mantém um bloqueio de leitura.
Um bloqueio de leitura bloqueará um bloqueio de gravação; um bloqueio de leitura não bloqueará um bloqueio de leitura; um bloqueio de gravação bloqueará todos os bloqueios de leitura e gravação. É por isso que quando a mesma página em dois frames grava na mesma Session, um deles tem que esperar que o outro (o um pouco mais rápido) termine antes de começar a escrever.
P: O que significa tempo limite suave da sessão?
Resposta: O tempo limite suave da sessão significa que enquanto sua página acessar (usar) a Sessão, o tempo limite será atualizado (pode ser entendido como retempo), ou seja, o tempo limite será recalculado a partir da solicitação da página. No entanto, a página não pode desabilitar a Sessão. Ele acessará automaticamente a sessão da página atual e atualizará o tempo limite.
Pergunta: Por que a sessão é inválida na função de manipulação de eventos em global.asax?
Resposta: Depende de qual função de manipulação de eventos a Sessão é usada. A sessão só é válida após o evento AcquireRequestState. Todas as funções de manipulação de eventos após este evento podem usar a Sessão, mas não as anteriores.
Descrição: Quando escrevo um componente que depende da Sessão da aplicação atual, por que não posso usar diretamente Session["Key"] para obter seu valor?
Resposta: Session["Key"] é na verdade this.Session["Key"], que é fornecido como uma propriedade de Page, portanto você não pode usar esta propriedade diretamente em seu componente. Você pode usar a Sessão das seguintes maneiras:
HttpContext.Current.Session["Key"] = "My Seesion Value";
P: Quando uso o modo InProc para salvar a Sessão, onde a Sessão é salva neste momento?
Resposta: Diferentes IISs possuem diferentes métodos de processamento.
Ao usar o IIS5, a sessão é salva no espaço do processo de aspnet_wp.exe.
Ao usar o IIS6, todos os aplicativos compartilham o pool de aplicativos por padrão e a sessão é salva no espaço do processo w3wp.exe.
P: O tempo limite da sessão está definido em minutos ou segundos?
Resposta: São minutos, o padrão é 20 minutos.
P: Minha sessão será salva quando ocorrer um erro na página? Preciso fazer alguma limpeza em Session_End, mas ela falha, por quê?
Resposta: Session_End só será executado quando a Sessão estiver rodando no modo InProc. A conta usada por Session_End é a conta que executa o processo de trabalho aspnet_wp (isso pode ser definido em machine.config). Portanto, se você usar segurança integrada para se conectar ao SQL no método Session_End, ele abrirá o link usando a conta do processo aspnet_wp, e o sucesso ou falha neste momento dependerá de suas configurações de segurança SQL.
Pergunta: Por que perco a sessão quando redireciono quando defino cookieless como verdadeiro?
Resposta: Ao usar cookieless, você deve usar caminhos relativos para substituir caminhos absolutos no programa. Se você usar caminhos absolutos, o ASP.NET não será capaz de salvar o SessionID na URL.
Por exemplo: substitua myDirmySubdirdefault.aspx por ..default.aspx.
Descrição: Como armazenar SortedList em Sessão ou Cache?
Resposta: Consulte os seguintes métodos:
ListaClassificada x = new ListaClassificada();
x.Add("Chave1", "ValorA");
x.Add("Chave2", "ValorB");
Salvar na sessão:
Sessão["ListaOrdenada1"] = x;
Use o seguinte método para obtê-lo:
SortedList y = (SortedList) Sessão["SortedList1"];
O mesmo vale para Chahe.
P: Por que recebo a mensagem de erro "O estado da sessão só pode ser usado quando enableSessionState está definido como verdadeiro, em um arquivo de configuração ou na diretiva Page"?
Resposta: Esse problema pode ocorrer após a instalação do Windows Sharepoint Server (WSS) em uma máquina que tenha instalado o ambiente de desenvolvimento Microsoft Visual Studio .NET.
O filtro WSS ISAPI tratará de todas as solicitações. Quando você navega em um aplicativo ASP.NET por meio de um diretório virtual, o filtro ISAPI não atribui URLs ao diretório da pasta.
A solução é: Não utilize Session na máquina onde o WSS está instalado.
Para informações detalhadas consulte:
O estado da sessão não pode ser usado no ASP.NET com o Windows SharePoint Services
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376Q
: Como excluir variáveis de sessão?
Resposta: Se quiser excluir a variável Session, você pode usar o método HttpSessionState.Remove().
P: Existe uma maneira de saber quanta memória a sessão de um aplicativo ocupa enquanto está em execução?
Resposta: Não. No momento este valor não pode ser verificado, pelo menos ainda não vi nenhuma informação sobre isso. No entanto, um valor pode ser estimado aproximadamente através do monitor de desempenho e do código do programa.
Descrição: Quando há um frameset na página, verifica-se que o SessionID da página exibida em cada frame é diferente na primeira solicitação.
Resposta: O motivo é que seu conjunto de quadros é colocado em uma página HTML em vez de em uma página ASPX.
Em circunstâncias normais, se o conjunto de quadros for uma página aspx, quando você solicitar a página, ele primeiro enviará a solicitação ao servidor web, e o SessionID será obtido. Em seguida, o navegador solicitará outras páginas no quadro respectivamente, para que o SessionID seja obtido. SessionID de todas as páginas É a mesma coisa, é o SessionID da página FrameSet.
Porém, se você usar uma página HTML para fazer uma página FrameSet, a primeira solicitação será a página HTML. Quando a página for retornada do servidor, nenhuma sessão será gerada. as páginas gerarão seu próprio SessionID, portanto, neste caso, esse problema surge. Ao atualizar a página, o SessionID será o mesmo e será o SessionID da última página solicitada.
P: É possível salvar sessões de aplicativos diferentes em bancos de dados diferentes no mesmo servidor SQL Server.
Resposta: Sim, consulte:
CORREÇÃO: Usar um banco de dados SQL para todos os aplicativos para o estado da sessão do SQL Server pode causar um gargalo
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680Q
: Posso obter objetos HttpSessionState e HttpContext válidos em Session_End?
Resposta: Você pode obter o objeto HttpSessionState neste método e acessá-lo diretamente usando Session. No entanto, o objeto HttpContext não pode ser obtido porque o evento não está associado a nenhuma solicitação, portanto não há objeto de contexto.
P: Ao usar a Sessão no modo SQL Server, por que minha Sessão não expira?
Resposta: No modo SqlServer, a expiração da sessão é concluída através do registro do SQL Agent. Verifique se o seu SQL Agent está em execução.
P: Depois de definir EnableSessionState como "ReadOnly", ainda posso modificar o valor da sessão no modo InProc. Por que isso acontece?
Resposta: Mesmo que EnableSessionState esteja marcado como ReadOnly, os usuários ainda poderão editar a sessão no modo InProc. A única diferença é que a Sessão não será bloqueada durante a solicitação.
P: Como posso evitar a especificação de uma senha ao vincular o SQL?
Resposta: Use um link confiável ou uma string de link criptografada. Para obter mais informações sobre isso, consulte:
Como usar o utilitário ASP.NET para criptografar credenciais e strings de conexão de estado de sessão
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290Q
: Como devo usar Session em minha própria classe?
Resposta: Você pode usar HttpContext.Current.Session. O método específico é o seguinte:
HttpContext.Current.Session["SessionKey"] = "SessionValue";
Da mesma forma, você pode usar o objeto Application dessa maneira.
P: Por que minha solicitação fica suspensa após alternar para o modo SQL Server?
Resposta: Verifique se todos os objetos salvos na Sessão podem ser salvos no modo SQL Server, ou seja, esses objetos devem suportar serialização.
Pergunta: Qual será o impacto quando a Sessão for definida como sem cookies?
Resposta: Quando cookieless é definido como verdadeiro, existem principalmente as seguintes restrições:
1. Links absolutos não podem ser usados na página
2. Além de alternar entre HTTP e HTTPS, algumas outras etapas precisam ser concluídas no aplicativo.
Se você enviar um link para outra pessoa, a URL neste momento conterá informações de ID da Sessão, então as duas pessoas compartilharão uma Sessão.
P: A Sessão pode ser salva no banco de dados?
Resposta: Claro, para obter detalhes, consulte: http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
--------------- -------------------------------------------------- -------------------------------------------------- ---
P: Por que minha sessão é frequentemente perdida quando a uso no modo InProc?
Uma situação adicional: se você usar um banco de dados Access, para evitar que o banco de dados seja baixado, algumas pessoas podem pensar em colocar o arquivo do banco de dados no diretório bin para que o download do banco de dados não possa ser feito. , isso também causará a perda da sessão. Porque ao acessar o aplicativo, os dados serão gravados no banco de dados com frequência, o que levará a alterações nos arquivos do banco de dados colocados no diretório bin, e as modificações no diretório bin causarão a perda da sessão.
Para resolver esse problema, você pode alterar o caminho de armazenamento do arquivo de banco de dados ou usar o modo StateServer ou SqlServer.
Para mais informações, consulte:
Problema: os dados da sessão são perdidos quando você usa o modo de estado de sessão ASP.NET InProc
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
-------------------------------------------------- -----------------------
Sessão compartilhada de vários projetos no Asp.net selecionada no Blog do dnyz
http://dev.csdn.net/article/21/21714.shtm
1. Crie uma solução em branco, como: d:MyProjectMyProject.sln
2. Crie um diretório raiz de aplicativo da Web d:MyProjectWebMis em d:MyProject e defina-o como o diretório virtual de http://localhost/WebMis
3. Crie novos diretórios de acordo com os módulos do diretório WebMis, como: d:MyProjectWebMisLogin e d:MyProjectWebMisCheckOut
4. Crie um novo aplicativo web baseado no módulo no VS.net, como: http://localhost/WebMis/Login e http://localhost/WebMis/CheckOut
5. Após a criação, os diretórios Login e CheckOut são automaticamente configurados como diretórios virtuais.
6. Adicione referências de projeto para Login e CheckOut no projeto WebMis
7. Exclua os diretórios virtuais de Login e CheckOut no Gerenciador IIS
8. Exclua o global.asax de cada projeto (remova o projeto raiz)
9. Remova o seguinte código do web.config do projeto (remova o projeto raiz):
<modo de autenticação="Windows" />
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
Ou exclua web.config (se não precisar configurá-lo em cada diretório)
10. Após a compilação, ele pode ser executado.