Avatar billede milandt Nybegynder
18. oktober 2008 - 13:51 Der er 5 kommentarer og
2 løsninger

Få min ASP.NET applikation til at genstarte sig selv

Jeg er ved at udvikle en APS.NET applikation der skal kunne installere sig selv. Når dette sker bliver der skrevet nogle ændringer i en connectionstrings.config fil, og herefter har jeg brug for at applikationen genstarter sig selv - i samme stil som hvis jeg lavede en iisreset eller overskrev web.config.

Kan man gøre dette i kode?
Avatar billede driis Nybegynder
18. oktober 2008 - 14:54 #1
Jeg har ikke prøvet det, men et bud kunne være at skrive til web.config programmatisk. Det er nok f.eks. bare at sætte LastWriteTime, så du undgår at skrive til indholdet.

Jvf. MSDN http://msdn.microsoft.com/en-us/library/ms178473.aspx:
Application Restarts
Modifying the source code of your Web application will cause ASP.NET to recompile source files into assemblies. When you modify the top-level items in your application, all other assemblies in the application that reference the top-level assemblies are recompiled as well.

In addition, modifying, adding, or deleting certain types of files within the application's known folders will cause the application to restart. The following actions will cause an application restart:

Adding, modifying, or deleting assemblies from the application's Bin folder.

Adding, modifying, or deleting localization resources from the App_GlobalResources or App_LocalResources folders.

Adding, modifying, or deleting the application's Global.asax file.

Adding, modifying, or deleting source code files in the App_Code directory.

Adding, modifying, or deleting Profile configuration.

Adding, modifying, or deleting Web service references in the App_WebReferences directory.

Adding, modifying, or deleting the application's Web.config file.

When an application restart is required, ASP.NET will serve all pending requests from the existing application domain and the old assemblies before restarting the application domain and loading the new assemblies.
Avatar billede lasserasch Juniormester
18. oktober 2008 - 15:37 #2
Du kan godt genstarte din application pool fra kode, men du kan ikke genstarte hele iis serveren. Det er vel heller ikke nødvendigt i dit tilfælde.

Dog skal du kende navnet på det application pool som kører din applikation.

Dette burde virke :

protected void stopAppPool(object sender, EventArgs e)
    {

        string appPoolName = "navnet på dit application pool";
        string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName;
        try
        {
            DirectoryEntry w3svc = new DirectoryEntry(appPoolPath);
            w3svc.Invoke("Stop", null);
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }

    protected void startAppPool(object sender, EventArgs e)
    {
        string appPoolName = "navnet på dit application pool";
        string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName;
        try
        {
            DirectoryEntry w3svc = new DirectoryEntry(appPoolPath);
            w3svc.Invoke("Start", null);
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }


Mvh.
Lasse
Avatar billede lasserasch Juniormester
18. oktober 2008 - 15:42 #3
Og på samme måde kan du også tjekke status på et application pool.

protected void status()
    {
        string appPoolName = "navnet på dit application pool";
        string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName;
        int intStatus = 0;
        try
        {
            DirectoryEntry w3svc = new DirectoryEntry(appPoolPath);
            intStatus = (int)w3svc.InvokeGet("AppPoolState");
            switch (intStatus)
            {
                case 2:
                    lblStatus.Text = "Running";
                    break;
                case 4:
                    lblStatus.Text = "Stopped";
                    break;
                default:
                    lblStatus.Text = "Unknown";
                    break;
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }

/Lasse
Avatar billede lasserasch Juniormester
18. oktober 2008 - 15:49 #4
Du kan selvfølgelig ikke køre denne kode fra samme applikation pool som du ønsker at genstarte. Dvs. du kan stoppe dit pool, men ikke starte det igen da applikationen hvori denne kode kører jo også vil stoppe med at virke :-)

Så denne kode skal køres i et seperat application pool.
Avatar billede milandt Nybegynder
18. oktober 2008 - 16:00 #5
Tak for feedback begge to.

Tror jeg forsøger med driis forslag, med at ændre på web.config. Det burde jeg have tænkt på selv.

Dit approach lasserasch er ikke rigtig en mulighed da jeg så ikke vil kunne starte applikationen op igen.

Vender lige tilbage når jeg har fået det til at virke.
Avatar billede driis Nybegynder
18. oktober 2008 - 17:00 #6
Jeg har lige lavet en lille test:

Denne kode restarter applikationen fint:

        protected void RestartClick(object sender, EventArgs e)
        {
            var fi = new FileInfo(Server.MapPath("~/web.config"));
            fi.LastWriteTime = DateTime.Now;
            Response.Redirect("/");
        }

For at teste det lavede jeg en Global.asax der sætter en StartTime property ved opstart og en side der udskriver værdien af StartTime.
    public class Global : System.Web.HttpApplication
    {
        public static DateTime StartTime { get; set; }

        protected void Application_Start(object sender, EventArgs e)
        {
            StartTime = DateTime.Now;
        }
    }
Avatar billede milandt Nybegynder
19. oktober 2008 - 10:54 #7
Mange tak for hjælpen :-)
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

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