Avatar billede innercitydk Nybegynder
02. oktober 2007 - 09:38 Der 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!");
    }
Avatar billede sherlock Nybegynder
02. oktober 2007 - 09:52 #1
Der må ske noget mere i controller.FrontendGalleryDelete, som er relevant.
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 10:59 #2
Det gør der ikke. Den kalder bare mediatoren som opbygger sql sætningen og sletter i databasen. Det er ikke her problemet opstår.
Avatar billede neoman Novice
02. oktober 2007 - 11:19 #3
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 ?
Avatar billede sherlock Nybegynder
02. oktober 2007 - 11:23 #4
Der må jo opstå en fejl i kaldet til FrontendGalleryDelete, siden den ikke returnerer.
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 11:56 #5
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.

Neoman - Nej det har jeg ikke.
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 12:02 #6
Har lige sat en try/catch blok omkring. Den fejler ikke!

public void btnGalleryEditDelete_Click(object sender, EventArgs e)
    {
        if (ddlGalleryEdit.SelectedIndex > 0)
        {
            try
            {
                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");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }
        else
            MessageBox.Show("Du skal først vælge et galleri!");
    }
Avatar billede sherlock Nybegynder
02. oktober 2007 - 12:03 #7
Så må du debugge og se hvad der sker i starten af gallery.aspx, efter redirecten.
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 12:04 #8
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("/");
            }
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 12:08 #9
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.
Avatar billede erikjacobsen Ekspert
02. oktober 2007 - 12:09 #10
Det er såmænd som det skal være ;)
http://forums.asp.net/t/966593.aspx
Avatar billede sherlock Nybegynder
02. oktober 2007 - 12:14 #11
har du prøvet at køre uden
  di.Delete(true);
?
Avatar billede sherlock Nybegynder
02. oktober 2007 - 12:19 #12
Fint Erik. Goddammit :|
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 12:21 #13
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[] { });

Smid et svar Erik!
Avatar billede erikjacobsen Ekspert
02. oktober 2007 - 12:22 #14
Ingen point til mig, tak.
Avatar billede erikjacobsen Ekspert
02. oktober 2007 - 12:24 #15
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.
Avatar billede innercitydk Nybegynder
02. oktober 2007 - 12:24 #16
Ok! Smid et svar Sherlock, så får du lidt for ulejligheden.
Avatar billede sherlock Nybegynder
02. oktober 2007 - 12:28 #17
Nej tak. Jeg er rigelig glad for at være blevet klogere.  :)
Avatar billede dr_chaos Nybegynder
02. oktober 2007 - 19:49 #18
Lol har lige siddet i 2 dage og kæmpet med samme problem.

Den løsning som du bruger betyder vidst nok noget for auto kompileringen af siden.
Avatar billede neoman Novice
02. oktober 2007 - 19:55 #19
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
Avatar billede dr_chaos Nybegynder
02. oktober 2007 - 20:13 #20
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
Avatar billede innercitydk Nybegynder
03. oktober 2007 - 17:49 #21
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester