02. oktober 2007 - 09:38Der er
20 kommentarer og 1 løsning
Mister session state efter sletning af folder
Hej Eksperter. Der er noget der driller mig noget så frygteligt!
Jeg har kodet noget galleriværk med forskellige paneler der vises afhængig af hvilken administrationsfunktion der forespørges på galleriet. Hvis man f.eks opretter et nyt galleri sættes en session variabel til true og siden reloades hvorefter denne session evalueres og der gives en besked til brugeren om at handlingen blev gennemført. Dette virker på alle paneler.
Mit problem opstår når man på rediger galleri panelet vil slette et galleri. Man kan opdatere og slette, og det er altså kun på slet delen det driller.
Når et galleri bliver slettet fjernes gallerimappen med alle undermapper, der slettes desuden en record i databasen. Herefter burde brugeren blive redirected som ved de andre paneler, men dette sker ikke. Istedet redirectes jeg til forsiden da jeg også har en administrator session der går tabt. Det hele virker hvis jeg ikke afslutter med at redirecte brugeren!
Er problemet at der automatisk ryddes noget op eller lignende når man sletter et directory?
Her er koden der udføres ved update og ved delete.
public void btnGalleryEdit_Click(object sender, EventArgs e) { if (ddlGalleryEdit.SelectedIndex > 0) { FrontendGallery oFgTmp = oFeGlist[ddlGalleryEdit.SelectedIndex - 1]; oFgTmp._oGheader = tbGalleryEditHeader.Text; oFgTmp._oGtext = tbGalleryEditText.Text; controller.FrontendGalleryEdit(oFgTmp); Session["success"] = true; Response.Redirect("gallery.aspx"); } else MessageBox.Show("Du skal først vælge et galleri!"); }
public void btnGalleryEditDelete_Click(object sender, EventArgs e) { if (ddlGalleryEdit.SelectedIndex > 0) { FrontendGallery oFgTmp = oFeGlist[ddlGalleryEdit.SelectedIndex - 1]; controller.FrontendGalleryDelete(oFgTmp._oGid); string path = Server.MapPath("/gallery/" + oFgTmp._oGpath + "/"); DirectoryInfo di = new DirectoryInfo(path); di.Delete(true); Session["success"] = true; Response.Redirect("gallery.aspx"); } else MessageBox.Show("Du skal først vælge et galleri!"); }
Du skulle vel ikke have noget error handling i web.config, custom errors osv kørende, et eller andet som redirecter til din login ting ? For response.redirect kaster nogle gange en exception, som du så måske uforvarende håndterer ?
Sherlock - som beskrevet er det ikke i db transaktionen det går galt! Den sletter jo fint den record jeg ber om. Den sletter også mappen uden problemer. Hvis jeg ikke redirecter efterfølgende er det intet galt mine sessions osv. er der stadig. Når jeg så redirecter opstår problemet. Det er kun ved delete, og den eneste forskel fra de andre kodeblokke er at den her sletter en fysisk mappe.
Det er denne kodeblok der udføres ved pageload som redirecter mig til forsiden med en besked om at jeg ikke har admin rettigheder. Den smider mig kun til forsiden ved delete funktionen :( Og det skal den ikke!
if (Session["admin"] != null) { if (!bool.Parse(Session["admin"].ToString())) { Session["success"] = false; Session["error"] = "Du har ikke admin rettigheder!"; Response.Redirect("/"); } } else { Session["success"] = false; Session["error"] = "Du har ikke admin rettigheder!"; Response.Redirect("/"); }
Kodemæssigt er der ikke noget galt. Det er derfor jeg efterspurgte om der var en med kendskab til en lignende situation hvor der har været io operationer efterfulgt af en redirect. Jeg har ikke mulighed for at debugge.
Det må jeg sq nok sige.. SUPER DET VIRKER!! Gjorde som beskrevet i det link Erik smed:
Oprettede en Global.asax fil og kopierede følgende ind i Application_Start:
//FIX disable AppDomain restart when deleting subdirectory //This code will turn off monitoring from the root website directory. //Monitoring of Bin, App_Themes and other folders will still be operational, so updated DLLs will still auto deploy. System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); object o = p.GetValue(null, null); System.Reflection.FieldInfo f = o.GetType().GetField("_dirMonSubdirs", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.IgnoreCase); object monitor = f.GetValue(o); System.Reflection.MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); m.Invoke(monitor, new object[] { });
Et alternativ er også ikke at bruge en in-process session, men lægge det på en stateserver (SQL). Cookien hos brugeren identificerer så en record på state-serveren, der overlever en apllikations-restart.
Gad vide hvor mange manhours worldwide går til blot dette dumme problem ? Har prøvet at bladre på MSDN, og kunne ingen steder se nogen "PAS PÅ DU KAN DUMME DIG NOGET SÅ GRUSOMT" warnings omkring DirectoryInfo :) - eller blot et hint at et .Delete kan have sådanne konsekvenser
Nope samme her. Vi fandt det ved at gå hver eneste linie igennem. Vi valgte så bare lave en response redirect via en querystring og så loade objektet efterfølgende
Det er det her der gør eksperten stærk. Altid fedt at få løst et problem man selv har kæmpet med i dagevis! Jeg var ved at blive sindsyg da der jo syntaksmæssigt, og logisk set ingen problemer var :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.
Stephen Alstrup stiftede for syv år siden Supwiz med tårnhøje ambitioner, og nu har han solgt selskabet til en norsk koncern: “Et utal af gange er jeg gået grædende i seng om aftenen”