U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Automatiseer het updaten van Mercator assemblies bij een website die gekoppeld is aan Mercator

0000002271     -      07-12-2021

Bij het ontwikkelen van een ASP.net website die gekoppeld is aan Mercator, worden de Mercator assemblies gekopieerd naar de Bin-directory van de website. Het probleem is dat de assemblies worden bijgewerkt in de hoofdmap van Mercator maar standaard niet in de Bin-map van de ASP.net toepassing. De update wordt pas uitgevoerd indien de programmeur een nieuwe versie in de website directory zet. Het doel van deze pagina is daarom om de update van de Mercator assemblies in de Bin-map te automatiseren.

Deze update wordt mogelijk gemaakt door het feit dat, tenzij anders aangegeven, een ASP.net-toepassing in modus shadow copy werkt. Dit betekent dat de assemblies niet rechtstreeks vanuit de Bin-directory worden uitgevoerd, maar eerst worden gekopieerd naar een tijdelijke directory van waaruit ze worden uitgevoerd. (Hierdoor moet men IIS gebruiken om de site te herstarten zodra een assembly is gewijzigd in de Bin-directory).

Om het updateproces te automatiseren, moet u de static ShadowUpdate methode van MercatorUi.Main gebruiken. Het verwacht 2 parameters:

  • de hoofdmap van Mercator
  • de doelmap, dus de Bin-map van de ASP.net-toepassing

Deze methode moet zo vroeg mogelijk aangeroepen worden, dus bij het initialiseren van de site. Dit zal gebeuren in de Global.asax. Deze controle moet vóór elke initialisatie uitgevoerd worden omdat IIS in het geval van een assembly-update automatisch de huidige instantie sluit en opnieuw start.

De event Main.ShadowUpdated wordt gebruikt om code uit te voeren wanneer een assembly wordt bijgewerkt, meestal een vermelding in een logbestand.

Voorbeeld van implementatie:

In het bestand Web.config kan u een sleutel aanpassen waarmee u de hoofddirectory van Mercator kan specificeren

<configuration>
    <appSettings>
        <add key="MainDir" value="\\pad_naar_mercator"/>
    </appSettings>
    ...
 
In de Global.asax wordt deze code geplaatst :
 
Zoom
        void Application_Start(object sender, EventArgs e)
        {
            // uitgevoerd
            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 die uitgevoerd wordt wanneer de toepassing wordt gestopt
            if (!Divers.Debug)
                MercatorUi.Main.ShadowUpdated -= new MercatorUi.Main.ShadowUpdatedEventHandler(Main_ShadowUpdated);
            Divers.End();
        }


Met de eigenschap Divers.Debug kan u weten of u zich in de ontwikkelomgeving begeeft. Dit is om geen vroegtijdige update uit te voeren wanneer de site in Visual Studio wordt uitgevoerd. De test kan bijvoorbeeld als volgt worden uitgevoerd :

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;
    }
}


De WebLog methode is optioneel. Hiermee kan u eenvoudig een dagelijks logbestand maken waarin u de gemaakte updates kunnen vastleggen.