Lorsque l'on développe un site web ASP.net lié à Mercator, les assemblies de Mercator référencées sont copiées dans le répertoire Bin du site web. La difficulté est que ces assemblies vont être mises à jour dans le répertoire principal de Mercator mais que, par défaut, ces mises à jour ne seront pas répercutées dans le répertoire Bin de l'application ASP.net, tant que le programmeur ne republie pas une nouvelle version de site. L'objet de cette page est donc de permettre l'automatisation de la mise à jour des assemblies de Mercator présentes dans le répertoire Bin à partir des versions se trouvant dans le répertoire principal de Mercator.
Cette mise à jour est rendue possible par le fait que, sauf spécification contraire, une application ASP.net fonctionne en mode shadow copy. Cela signifie que les assemblies ne sont pas directement exécutées depuis le répertoire Bin mais sont d'abord copiées dans un répertoire temporaire à partir duquel elles seront exécutées. (Cela permet notamment à IIS de redémarrer le site dès qu'un assembly a été modifié dans le répertoire Bin).
Pour automatiser le processus de mise à jour, il faut utiliser la méthode statique ShadowUpdate de MercatorUi.Main. Elle attend 2 paramètres :
- le répertoire principal de Mercator
- le répertoire de destination, donc le répertoire Bin de l'application ASP.net
Typiquement, cette méthode doit être appelée au plus tôt lors de l'initialisation du site. Cela va se faire dans le Global.asax. Cette vérification doit se faire avant tout autre initialisation parce que dans le cas d'une mise à jour d'assembly, IIS va automatiquement fermer l'instance en cours et la redémarrer.
L'évènement Main.ShadowUpdated permet d'exécuter un code lorsqu'un assembly est mis à jour, typiquement une inscription dans un fichier de log.
Exemple d'implémentation :
Dans le fichier Web.config, on a placé une clé permettant de spécifier le répertoire principal de Mercator
<configuration>
<appSettings>
<add key="MainDir" value="\\chemin_vers_mercator"/>
</appSettings>
...
Dans le Global.asax, nous avons placé ce code :
void Application_Start(object sender, EventArgs e)
{
// Code qui s'exécute au démarrage de l'application
string mainDir = MercatorApi.Api.AddBS(System.Configuration.ConfigurationManager.AppSettings["MainDir"]);
if (!Divers.Debug)
{
MercatorUi.Main.ShadowUpdated += new MercatorUi.Main.ShadowUpdatedEventHandler(Main_ShadowUpdated);
MercatorUi.Main.ShadowUpdate(mainDir, MercatorApi.Api.AddBS(AppDomain.CurrentDomain.BaseDirectory) + "bin");
}
Divers.Start(mainDir);
}
void Main_ShadowUpdated(MercatorUi.Main.ShadowUpdatedEventArgs e)
{
Divers.WebLog(string.Format("Update assembly {0} {1} -> {2} {3} : {4}", e.SourceAssembly, e.SourceAssemblyVersion, e.TargetAssembly, e.TargetAssemblyVersion, e.IsOK ? "OK" : e.Exception.Message));
}
void Application_End(object sender, EventArgs e)
{
// Code qui s'exécute à l'arrêt de l'application
if (!Divers.Debug)
MercatorUi.Main.ShadowUpdated -= new MercatorUi.Main.ShadowUpdatedEventHandler(Main_ShadowUpdated);
Divers.End();
}
La propriété Divers.Debug permet de savoir si on évolue dans l'environnement de développement ou pas. Ceci afin de ne pas effectuer de mise à jour intempestive lorsque l'on exécute le site dans Visual Studio. Le test peut, par exemple, être effectué comme suit :
private static bool? debug;
public static bool Debug
{
get
{
if (debug == null)
debug = System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToLower().Contains("iisexpress");
return debug ?? false;
}
}
La méthode WeLog est optionnelle. Elle permet simplement de créer un fichier Log journalier dans lequel on va enregistrer, dans le cas qui nous préocuppe, les mises à jour effectuées.