2009-09-07 6 views
5

Voglio caricare il runtime ASPNET, eseguire una o più pagine, quindi scaricarlo. Questo è per scopi di test. Non è un test dell'interfaccia utente; Sto solo testando l'uso di una libreria in un contesto ASPNET.Come caricare + scaricare runtime ASPNET, senza utilizzare la directory bin, per scopi di test automatici

Normalmente questo tipo di operazione viene eseguita con una chiamata a System.Web.Hosting.ApplicationHost.CreateApplicationHost.

Questo è il modo che ho attualmente:

public class Manager : System.MarshalByRefObject 
{ 
    private void HostedDomainHasBeenUnloaded(object source, System.EventArgs e) 
    { 
     aspNetHostIsUnloaded.Set(); 
    } 

    private ManualResetEvent aspNetHostIsUnloaded; 


    public void Run(string[] pages) 
    { 
     bool cleanBin = false; 
     MyAspNetHost host = null; 

     try 
     { 
      if (!Directory.Exists("bin")) 
      { 
       cleanBin = true; 
       Directory.CreateDirectory("bin"); 
      } 

      var a = System.Reflection.Assembly.GetExecutingAssembly(); 
      string destfile= Path.Combine("bin", Path.GetFileName(a.Location)); 
      File.Copy(a.Location, destfile, true); 

      host = 
       (MyAspNetHost) System.Web.Hosting.ApplicationHost.CreateApplicationHost 
       (typeof(MyAspNetHost), 
        "/foo", // virtual dir 
        System.IO.Directory.GetCurrentDirectory() // physical dir 
       ); 

      aspNetHostIsUnloaded = new ManualResetEvent(false); 

      host.GetAppDomain().DomainUnload += this.HostedDomainHasBeenUnloaded; 

      foreach (string page in pages) 
       host.ProcessRequest(page); 

     } 
     finally 
     { 
      // tell the host to unload 
      if (host!= null) 
      { 
       AppDomain.Unload(host.GetAppDomain()); 

       // wait for it to unload 
       aspNetHostIsUnloaded.WaitOne(); 

       // remove the bin directory 
       if (cleanBin) 
       { 
        Directory.Delete("bin", true); 
       } 
      } 
     } 
    } 

}  

Questa è l'host ASP.NET personalizzato:

public class MyAspNetHost : System.MarshalByRefObject 
{ 

    public void ProcessRequest(string page) 
    { 
     var request = new System.Web.Hosting.SimpleWorkerRequest(page,    // page being requested 
                   null,    // query 
                   System.Console.Out // output 
                   ); 
     System.Web.HttpRuntime.ProcessRequest(request); 
    } 


    public AppDomain GetAppDomain() 
    { 
     return System.Threading.Thread.GetDomain(); 
    }  
} 

Questo funziona bene. Ma vorrei evitare la creazione della directory bin, e la copia del gruppo in esso, se possibile.

E 'possibile utilizzare CreateApplicationHost, e dire ASPNET per caricare assembly dalla directory corrente, o una directory arbitraria, piuttosto che bin?

EDIT :: semplificato il codice un po '. EDIT2 :: Ho guardato la risposta di Womp ma sembra che si stia facendo un sacco di lavoro per evitare un po '. Altre idee?

risposta

1

Questa è una grande domanda. Mi ricordo di avere a che fare con un problema simile un paio di anni fa (ho voluto avere un applicationhost utilizzare un file di configurazione personalizzato) e segnalibro this blog post che ho usato per farmi iniziare.

Probabilmente è un modo eccessivo per ciò che effettivamente si desidera, ma forse può indirizzarvi nella giusta direzione.

+0

Wow, nuovo processo, variabili d'ambiente, GAC ... suona come un sacco di lavoro per evitare di me la creazione e la rimozione di una directory. È l'idea giusta però ... dovrò vedere se riesco a semplificarlo. – Cheeso

Problemi correlati