Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Automatiser la mise à jour des assemblies de Mercator dans un site web lié à Mercator

0000002271     -      07/12/2021

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 :
 
Zoom
        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 :

Zoom
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.