Domanda

Ho fatto qualcosa di simile al seguente codice:

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 si preme il tasto di cancellazione, tutto funziona bene e la cartella viene eliminato. ma dopo che, quando page postback di nuovo poi un NullRefrenceException è sollevata in  Label1.Text = Session [ "loginid"] ToString ();.

perché sta accadendo ... ??

Quando non sto usando questo Directory.Delete () metodo di tutto sta funzionando benissimo e le variabili di sessione non sono impostate a null.

Quando ho tracciato la mia domanda ho scoperto che dopo Directory.Delete () Le variabili di sessione metodo erano intatti e sono stato in grado di utilizzare tali variabili di sessione nella lavorazione dopo Directory.Delete ().

Ma non appena i postback della pagina tutte le variabili di sessione sono impostate a null. E questo problema non viene visualizzato quando non sto usando questo metodo delete ().

La cartella I m eliminazione è nella cartella del mio progetto. I m al funzionamento di questo sito web utilizzando Visual Studio.

Si prega di aiutare.

È stato utile?

Soluzione

Solo un altro indovinare qui, ma forse è perché il vostro modificare qualcosa nella vostra directory di applicazioni (un sospetto dal vostro usando Server.MapPath con il ~). IIS forse pensa che l'applicazione è cambiato e ricicla l'applicazione e, di conseguenza spazza via tutte le sessioni.

Questo è simile a se si modifica il file web.config mentre qualcuno sta usando l'applicazione e si scende tutte le sessioni e ricicla l'applicazione. Stai eliminando una directory che può contenere informazioni che IIS sta usando per l'applicazione?

Hai detto che succede solo quando si include quella linea di codice e una sessione andranno spazzato davvero solo in modo coerente (a meno che non si sta facendo da soli manualmente) quando l'applicazione viene riciclato da IIS o timeout. Non è ovviamente timeout in modo che il riciclo deve essere ciò che sta accadendo.

Altri suggerimenti

E 'cartella 'files' nella cartella dell'applicazione web? Forse applicazione stessa riavviare quando l'eliminazione dei file. Cercate di usare sessionStateServer. Il suo tenere in vita le sessioni.

web.config:

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

L'eliminazione di una cartella nella directory virtuale può causare l'applicazione per re-start, perdendo in tal modo tutti i dati di sessione. Per evitare questo, eliminare singoli file (non le cartelle) o utilizzare lo StateServer per mantenere le sessioni.

Dal momento che la pagina viene caricata correttamente prima di premere il tasto di cancellazione, il problema è presumibilmente con il riferimento Session["loginid"].ToString(). Avete qualche altro codice che fa riferimento Session["loginid"]? Il codice che avete mostrato qui non farà nulla che rimuove loginid dalla sessione.

Tuttavia, se l'applicazione è in esecuzione su un cluster di server e si sta utilizzando la modalità sessione predefinita di in-process, si può perdere l'accesso alla sessione tra le richieste HTTP perché sono gestite da server diversi. Vedere qui per ulteriori informazioni.

  

Se rimuovo il directory.delete ()   funzione dal codice quindi tutta   applicazione è in esecuzione in modo bene anche senza   qualsiasi eccezione

Ok, sembra che abbiamo trovato il vostro problema. Il vostro progetto non ha i privilegi necessari per eliminare la direcotry (anche se la directory è deleted.nevertheless: ci sono problemi di privilegio)

Credo che sei applicazione è un'eccezione durante l'esecuzione di questa operazione di file e una nuova sessione inizia. Ho una situazione simile su uno dei miei progetti, ma non ho ancora capito come risolverlo.

Sono abbastanza sicuro che concordare con descrizione, se si crea il Global.asax e impostare punti di interruzione su Application_OnError e Session_OnStart (o tuttavia questi metodi sono scritte correttamente). Vedrete che la viene generato un errore e poi si avvia una nuova sessione.

In primo luogo, un paio di controlli di integrità:

  1. funziona sessione come previsto su altre pagine?
  2. è il vostro metodo di eliminazione eliminazione di file in una cartella speciale ASP.NET, come App_Data o App_Code, che potrebbe essere la causa l'applicazione per riavviare?

Ecco quello che vorrei provare a eseguire il debug di questo problema, dopo aver controllato quanto sopra:

  1. Imposta un punto di interruzione il metodo delete e hanno la variabile di sessione in una finestra di controllo. Vedere ciò che il valore della variabile di sessione è prima della chiamata a Directory.Delete è e ciò che è dopo. E 'a quel punto quando stai perdendo la sessione, o non è fino a quando la pagina successiva visita?
  2. Utilizzare uno strumento come Fiddler per esaminare i cookie scambiati tra il browser e il server web sul postback. Verificare che quando il browser visita prima viene creato un nuovo cookie di sessione e memorizzati sul browser. Poi, quando l'eliminazione della cartella, vedere se il server web sta inviando un nuovo cookie di sessione sulla risposta di quel postback. Ciò indicherebbe che una nuova sessione è stata creata.

Grazie

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top