Pergunta

Eu fiz algo parecido com o seguinte código:

protected void Page_Load(object sender, EventArgs e)
{
   Label1.Text = Session["loginid"].ToString();
}

protected void delete_click(object sender, EventArgs e)
{
    delete("mail1",Session["loginid"]);
}

private int delete(string mailid, string user)
{
 System.IO.Directory.Delete(Server.MapPath(@"~\files\" + user + @"\" + mailid), true);
}

Quando pressiono o botão excluir, tudo funciona bem e a pasta é excluída.Mas depois disso, quando a página postagem novamente, uma NullRefrenceException é levantada em LABEL1.TEXT = SESSÃO ["LOGINID"]. ToString ();

por que isso está acontecendo...??

Quando não estou usando este método Directory.Delete(), tudo funciona bem e as variáveis ​​​​de sessão não são definidas como nulas.

Quando rastreei meu aplicativo, descobri que as variáveis ​​de sessão do método After Directory.Delete() estavam intactas e pude usar essas variáveis ​​de sessão no processamento após Directory.Delete().

Mas assim que a página é postback, todas as variáveis ​​de sessão são definidas como nulas.E esse problema não aparece quando não estou usando o método delete().

A pasta que estou excluindo está na pasta do meu projeto.Estou executando este site usando o Visual Studio.

Por favor ajude.

Foi útil?

Solução

Apenas mais um palpite aqui, mas talvez seja porque você está modificando algo em seu diretório de aplicativos (um palpite desde que você está usando Server.MapPath com o ~).O IIS talvez pense que o aplicativo foi alterado e recicla o aplicativo e, como resultado, elimina todas as sessões.

Isso é semelhante a se você modificar seu arquivo web.config enquanto alguém estiver usando o aplicativo e ele descartar todas as sessões e reciclar o aplicativo.Você está excluindo um diretório que pode conter informações que o IIS está usando para o aplicativo?

Você disse que isso só acontece quando você inclui essa linha de código e uma sessão só será eliminada de forma consistente (a menos que você faça isso manualmente) quando o aplicativo for reciclado pelo IIS ou expirar.Obviamente, o tempo não está esgotado, então a reciclagem deve ser o que está acontecendo.

Outras dicas

A sua pasta 'arquivos' está na pasta do seu aplicativo da web?Talvez o aplicativo seja reiniciado quando você exclui os arquivos.Tente usar sessionStateServer.É manter as sessões vivas.

Web.config:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>

Excluir uma pasta em seu diretório virtual pode fazer com que seu aplicativo seja reiniciado, perdendo assim todos os dados da sessão.Para evitar isso, exclua arquivos individuais (não pastas) ou use o StateServer para manter suas sessões.

Como a página carrega corretamente antes de você pressionar o botão Excluir, o problema provavelmente está no Session["loginid"].ToString() referência.Você tem algum outro código que faça referência Session["loginid"]?O código que você mostrou aqui não fará nada que remova loginid da Sessão.

No entanto, se esse aplicativo estiver sendo executado em um cluster de servidores e você estiver usando o modo de sessão padrão em processo, poderá perder o acesso à sua sessão entre solicitações HTTP porque elas são tratadas por servidores diferentes.Ver aqui Para maiores informações.

Se eu remover a função Diretório.Delete () do código, todo o aplicativo estará funcionando tão bem sem nenhuma exceção

Ok, parece que encontramos seu problema.Seu projeto não possui os privilégios necessários para excluir o diretório (mesmo que o diretório seja excluído. No entanto:existem problemas de privilégio)

Acho que seu aplicativo está lançando uma exceção ao executar esta operação de arquivo e uma nova sessão é iniciada.Tenho uma situação semelhante em um dos meus projetos, mas ainda não descobri como resolver.

Tenho certeza de que você concordará com a descrição se criar o Global.asax e definir pontos de interrupção Aplicativo_OnError e Sessão_OnStart (ou como esses métodos estão escritos corretamente).Você verá que um erro é gerado e depois uma nova sessão é iniciada.

Primeiro, algumas verificações de sanidade:

  1. A sessão funciona conforme esperado em outras páginas?
  2. O seu método Delete está excluindo arquivos em uma pasta ASP.NET especial, como App_Data ou App_Code, o que pode estar causando a reinicialização do aplicativo?

Aqui está o que eu tentaria depurar esse problema, depois de verificar o acima:

  1. Defina um ponto de interrupção no método delete e coloque a variável de sessão em uma janela de observação.Veja qual é o valor da variável de sessão antes da chamada para Directory.Delete e qual é depois.É nesse ponto que você perde a sessão ou só na próxima visita à página?
  2. Use uma ferramenta como o Fiddler para examinar os cookies trocados entre o navegador e o servidor web nos postbacks.Verifique se quando o navegador visita pela primeira vez um novo cookie de sessão é criado e armazenado no navegador.Então, ao deletar a pasta, veja se o servidor web está enviando um novo cookie de sessão na resposta desse postback.Isso indicaria que uma nova sessão foi criada.

Obrigado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top