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?
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